tmuxウィンドウ名をprompt_command、ps1またはリモートsshホスト名に変更しますか?


25

tmuxウィンドウのタイトルを自動的にprompt_command、ps1、または単にマシンのホスト名に変更できるようにしたいと思いますssh。「ssh」というラベルの付いた9つのウィンドウを開くことは、実際には役に立ちません。sysadminの作業を行うと、新しい画面を開き、sshを何度も開いて手動で名前を変更します。

私が気づいたことの1つはtmuxxtermウィンドウのタイトルが更新されることです。

何か助け?screenこの機能を取得できたら、いつでも戻って来たいと思います。

回答:


15

私はあなたをPS1直接見る方法を知りません。

ただし、tmuxウィンドウ名を設定するのと同じコマンドを理解してscreenいます。

~/.bashrcorでこのような関数を定義できます~/.zshrc

settitle() {
    printf "\033k$1\033\\"
}

その後settitle、どこからでも呼び出します。

たとえば、PS1変数に含めることができます。たとえば

PS1='$HOST:$PWD$(settitle $HOST:$PWD)$ '

または経由PROMPT_COMMAND

PROMPT_COMMAND='$(settitle $HOST:$PWD)'
# and don't change PS1

これtmuxで、デスクトップでssh実行していること、およびコマンドではなくホスト名を使用したいことがsshわかりました。これははるかに簡単です。

settitlelocal ~/.bashrcに追加したら、これも追加するだけです。

ssh() {
    settitle "$*"
    command ssh "$@"
    settitle "bash"
}

bashをzsh、または必要に応じてより適切なものに置き換えます。


これは、リモートボックスに.bashrcを設定せずに、ウィンドウタイトルにリモートボックスのホスト名を実際に指定しないでください。私はいくつかの滑らかさを学びましたが、ありがとうございます。
-user68782

ローカル側のホスト名だけが必要な場合は、はるかに簡単です。ちょっと待ってください
...-Mikel

ブリリアント!ありがとうございました。申し訳ありませんが、リクエストを説明できなかったため、2つの質問がありました。再び、ありがとう!
user68782

tmuxは気まぐれにウィンドウタイトルを変更するため、tmuxによるウィンドウタイトルへの通常の変更により、これは非常に迅速に上書きされます。
ユタジャーヘッド

ありがとう!使用しましたPROMPT_COMMAND='settitle $HOSTNAME:$PWD'-@Mikelのコードでは、-bash: : No such file or directory各コマンドプロンプトの前にホスト名とエラーが表示されませんでした。私は、$()bash settitle が返すものを実行しようとするように思えます。(Linuxでbashを実行しています。)
tuomassalo

35

tmux rename-window -t${TMUX_PANE} "Title Text"

これは、ウィンドウにtmuxタイトルを設定する適切な方法です。$ TMUX_PANE変数はtmuxによって設定され、異なるペインを区別するために使用されます。


2
これはアクティブなウィンドウなので、-t${TMUX_PANE}必要だとは思いません(少なくとも私にとってはそうではありませんでした)。
クリストファー

8
@Christopher実行中、たとえばsleep 3ウィンドウを切り替えている場合、スリープが完了すると、プロンプトは間違ったウィンドウにコマンドを発行します。(これが私がここに来た理由です、+ 1)。
-quornian


8

Mikelの回答とUtahJarheadの回答の両方を組み合わせて、.zshrcこの問題を解決するために以下を使用しました。

ssh() {
    tmux rename-window "$*"
    command ssh "$@"
    exit
}

デフォルトで自動ウィンドウ名の変更が有効になっていますが、リモートホストを終了した後に再び有効にする方法が見つかりません。したがって、ウィンドウを完全に終了するだけで、ワークフローの問題ではありません。名前を「bash」などに変更する場合は、exit行をに置き換えますtmux rename-window "bash"


1
hostname -sコマンドssh "@ $"の後にtmux rename-windowを使用しています。これは基本的にタイトルを私の "ゲートウェイ"マシンに "リセット"します。
アンドレイ

7

代わりに、exitまたはtmux rename-window "bash"使用できます

ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
            tmux rename-window "$*"
            command ssh "$@"
            tmux set-window-option automatic-rename "on" 1>/dev/null
    else
            command ssh "$@"
    fi
}

これにより、次のコマンドのウィンドウの名前を自動的に変更する通常の機能が再びアクティブになります。

if名前の変更(それなし)からブロック防止tmuxから現在のウィンドウをssh他のシェル(外に使用されるコマンドtmux)。


私はもののif env | grep -q "TMUX_PANE"; then代わりに行きましたps -p...が、同じ原理です。
原子数

1

私はこれがかなり前に回答されたことを知っていますが、(受け入れられた回答に基づいて)私がいじって見つけたものを追加すると思いました..これをすべてのサーバーの/ etc / bashrcに追加しました(簡単に布、人形などで行います)

settitle() {
    printf "\033k$1\033\\"
}
bash_prompt_command() {
    settitle "`hostname -s`:$PWD"
}
PROMPT_COMMAND=bash_prompt_command

また、画面またはtmuxでウィンドウ名を自動的に設定します。


我々はそう、内部DNSを使用するhostname -sので、余分なドメインのものを取り除くことまでちょうどサーバー1としてserver1.internal.localショー
ブライアン・

1

別の解決策は、sshセッションの後に、アクティブウィンドウの名前を以前の名前に変更することです。

ssh() {

local code=0
local ancien

ancien=$(tmux display-message -p '#W')

if [ $TERM = tmux -o $TERM = tmux-256color ]; then

    tmux rename-window "$*"

    command ssh "$@"

    code=$?
else
    command ssh "$@"

    code=$?
fi

tmux rename-window $ancien

return $code
}

0

これは、tmux 2.1ローカルおよびサーバー上のzsh 内およびzshで機能します。

ssh() {
    tmux set-option allow-rename off 1>/dev/null
    tmux rename-window "ssh/$*"
    command ssh "$@"
    tmux set-option allow-rename on 1>/dev/null
}

Windowsの名前を変更する前にallow-renameオプションを手動で無効にする必要がありました-そうしないと、ほとんどのサーバーで現在のパスに変更されました(zshも使用)。良いことは、allow-renameオプションを再度有効にすると、すぐに機能することです。


0

これを追加する.profile.bashrc

# Change window name for `tmux`
ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
        #tmux rename-window "$(echo $* | cut -d . -f 1)"
        tmux rename-window "$(echo $* | cut -d @ -f 2)"
        command ssh "$@"
        tmux set-window-option automatic-rename "on" 1>/dev/null
    else
        command ssh "$@"
    fi
}

0

これらすべての例では、次のことに注意してください。

command ssh "$@"

終了コードを取得して、それで関数を終了したい場合があります。

ssh server false

0を返します。

command ssh"$@"
_exitcode=$?
#other code
exit $_exitcode

sshの戻りコードでsshを終了します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.