tmuxコマンドを実行して、現在のtmuxセッション名を知る方法


34

スクリプトを書いています。これを本当に知りたいです。tmux実行可能ファイルがこれを教えてくれることを願っています。

見つけた

tmux rename <newname>

現在のセッションの名前を変更できます。しかし、自分の名前を取得するコマンドが見つかりません。

回答:


49

tmuxの 1.2(およびそれ以降)は、使用することができます-pのオプションをdisplay-message出力する(代わりに接続されたクライアントにそれを表示する)標準出力へのメッセージを。

tmux display-message -p '#S'

#Sセッション名としてフォーマットされstatus-leftます(manページのオプションの説明を参照)。


+1、私の答えよりもはるかに良い。
-chepner

tmux 1.2が必要であることを指摘していただきありがとうございます。tmux1.2は、openSUSE 11.3の自動オンラインアップデートで使用可能なバージョンです。
ジムチェン

tmux 1.8では、このセッションで作業していないときでも、接続されたセッションの名前が返されます。
ミハイダニラ

以下のTim Peopleの回答はtmux 1.8以降で機能し、彼が提起するポイントに対応しています。それがより良い答えです。
アレクサンドロス

8

5年近くたっても、これらの答えがどちらも適切ではないと指摘した人は誰もいなかったことに驚いています。現在のTTYがホスト上の唯一のtmuxセッションに接続されている限り、両方とも正常に機能しますが、これらの回答は両方とも次の場合にフラットになります。

  1. 現在の端末セッションがtmuxセッションの一部ではない、または
  2. 複数の接続されたtmuxセッションがあります

前者の場合、ここの両方の回答は、接続されているセッションの名前を返します(現在のttyがそのセッションによって管理されているかどうかに関係なく)。後者の場合、結果は不確定であるか、複数の回答になります。

適切な質問は、「現在のターミナルセッションが接続されているtmuxセッションの名前は何ですか?」です。

彼はその質問に答えるために、実行します:

for s in $(tmux list-sessions -F '#{session_name}'); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$(tty)" | awk '{print $2}'

これは、(接続されているかどうかに関係なく)tmuxセッションの数に関係なく、現在の端末セッションがtmuxセッションの一部であるかどうかにかかわらず機能します。


1
素晴らしい答え。各セッション名をループしてペインをリストするのではなく、tmux list-panes -a -F '#{pane_tty} #{session_name}'すべてのセッションのペインをリストするために使用することもできます。どれだけ新しいのかわからない-aので、YMMV。
ブライアンクライン

受け入れられた回答を使用し、ここで説明する問題に従って失敗した後、この質問に戻ってきました。これを賛成してください。可能であれば、受け入れられた回答を変更する必要があります。
アレクサンドロス

1
方法1 は、一般的なデスクトップセットアップTMUXを実行tmux display-message -p '#S'する前に環境変数をチェックすることと組み合わせると正常に機能します。
ZeroPhase

8

拡張/修正TIM-人々の答えを 通りdon_crisstiさんのコメント、これはなぜされてgrep -v期待通りに機能していませんか?

tim-peoplesの回答にある「$(tty)」コマンド

| grep "$(tty)" |

そのコンテキストでは期待どおりに動作しません。文字列「not a tty」に評価されます。

この問題を変数で置き換えることで解決します。

tty = $(tty)

...

| grep "$ tty" |

また、tmuxセッションが存在しない場合、元のコードは以下を生成します

「/ tmp / tmux-1000 / defaultでサーバーが実行されていません」エラーメッセージ。

追加する2>/dev/nullと、エラーメッセージを出力せずにコードが実行されます。

変更されたコードは次のようになります。

tty=$(tty)
for s in $(tmux list-sessions -F '#{session_name}' 2>/dev/null); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$tty" | awk '{print $2}'

1
改善点は何ですか?必要な場合は、回答ではなく編集として提出することを検討してください。これを適切な回答にするために、より説明的なテキストを含めることを検討する必要があります。
セス

1
@seth、私はコメントしたかったが、奇妙なことに、そうするのに十分な信用を持っていなかった。
ブライトサイド

コメントするには50の評判が必要です。通常、改行などがないため、複雑なコードでコメントすることはお勧めできません。あなたの編集はそれをかなり良い答えにしました。
セス

ああ、私は今それを得る。「tty」問題はbashの問題です。私はそのおもちゃのシェルを使用しません:D
ティムピープルズ

1
@TimPeoples Bashの問題かもしれませんが。Bashは、現在の端末との互換性を保つためにシェルスクリプトをコーディングするための標準です。確かに、posix標準は理想的です。ただし、bashには、より高度な端末がすべて共有する機能がいくつかあります。Bashを押すと、他の主要な端末のほとんどが機能するはずです。シェルチェックを実行するだけで、多数の悪いエラーとフォーマットの問題を検出します。(主に現在のより記述的な構文の代わりに古い構文を使用)
ZeroPhase

4
  • クリスジョンセンの答えは、外部からクエリを実行する場合でもセッション名を返します。
  • 明るい側のとティム人民答えが前提とtty

代わりに、私はこれが私にとって正確に機能することがわかりました:

if [[ -n "$TMUX_PANE" ]]; then
    session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi

3

理想的ではありませんが、次のコマンドで接続セッションの名前を抽出できますawk

tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'

カスタム形式は、デフォルトよりも少し簡単に解析できます。

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