tmuxセッションの名前を知るにはどうすればよいですか?


13

最近、私はを使い始めましたtmux。いいと思いますが、このアプリケーションの理解にまだ問題があります。私が持っている基本的な質問の1つは次のとおりtmuxです。ログインしているセッションの名前は(コマンドラインから)どうすればわかりますか?何らかのtmuxセッションにログインしている場合、その名前が表示されます。ただし、tmuxセッションにログインしていない場合、何も出力されないか、何らかのエラーが出力されます。

回答:


17

セッションの名前は変数に保存され、#Sアクセスするには、次のようにします。

tmux display-message -p "#S"

で使用したい場合は.tmux.conf、単純#Sです。-pオプションは標準出力にメッセージを出力することに注意してください。そうでない場合、メッセージはステータス行に表示されます。

上記のコマンドがセッション内で呼び出されると、セッションの名前が返されます。セッションの外部で呼び出された場合、まだ実行中の最後のセッションの名前を返します。セッション内にあるかどうかを確認するコマンドが見つからなかったため、この回避を考え出す必要がありました。

tmux list-sessions | sed -n '/(attached)/s/:.*//p'

tmux list-sessionsすべてのセッションが表示さ(attached)れます。接続されている場合は、最後に表示されます。我々はすべての出力(オプション抑える-n私たちはキーワードを見つける場合を除く)を(attached)、この行では、我々は後everyhing切り取られ:たセッションの名前で私たちを残しています、。これは、セッションとは対照的に、セッションの内外で機能しますtmux display-message -p "#S"

もちろん、これはセッションの名前にno :とno がある場合にのみ機能し(attached)ます。

Chris Johnsenがコメントしたように、セッション内にあるかどうかを確認する方法は、環境変数が設定されているかどうかを確認することです。

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"

1
たとえそれが正しいように見えても、私にとってはうまくいかなかったことを認めなければなりません。2つのコンソールがあり、一方にはtmuxセッションがあり、もう一方にはtmuxセッションの外にいます。両方のコマンドを入力するtmux display-message -p "#S"と、同じ結果が出力され、両方のコマンドの戻り値は同じです。
e271p314 14年

同じ動作が見られます。回避策については、更新された回答をご覧ください。
pfnuesel

4
たぶん、TMUX環境変数(通常はセッション内のプロセスに設定され、セッション外には設定されません)をチェックするだけで逃げることができます。しかし、それはかなり信頼できるはずです)。kshbashのzshの、エトセトラ:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
クリス・ヨンセン

コメントをありがとう。それは確かに、よりエレガントな方法であり、十分に堅牢です、と私は思います。回答にコメントを追加しました。
pfnuesel 14年

同時に異なる名前の2つのtmuxセッション内にいる場合はどうなりますか?これは機能しますか?
ミハイダニラ

0

ここを、この投稿を使用して、tmuxクライアントを区別する1つのことは彼らのものですttyが、セッション名はtmuxサーバープロパティであり、tmuxクライアントの内側または外側からセッション名を見ると同じであることを理解しました。次に、tmux info | headクライアントのpidとtty、およびサーバーのpidを表示するを使用できます。

tmux info | grep $$ | grep -q `ps -p $$ -o tty=`

次のコマンドの戻り値は、tmuxクライアント内にいる場合は0 、tmuxクライアント外で実行している場合はゼロ以外です。スクリプトから実行している場合、ttyは実行中のスクリプトではなくシェルプロセスに関連付けられているため、$$ではなくppidを使用してください。

1つの簡単な方法ですが、tmuxクライアントが内部か外部かを知るのにそれほど堅牢ではありませんが、TERM環境変数を見ることです。クライアントの外部では「xterm」と表示されますが、内部では「screen」と表示されます。しかし、私は最初の方法の方がずっと良いと思います。


0

perlスクリプトは次のとおりです。シェルスクリプトまたはシェルスクリプト関数にすることは、読者に任された課題です。

#!/opt/local/bin/perl

use strict;
use warnings;

if (exists $ENV{'TMUX'}) {
    # session ID is the last element
    # /tmp/1s/ffkjhk76sdgn/T/tmux-771/default,16772,8
    my($id) = $ENV{'TMUX'};
    $id =~ s{^.*,(\d+)$}{$1};

    # get session name
    my($cmd) = q(tmux ls -F "#{session_name}: #{session_id}");
    open(IN, "$cmd |") || die qq([ERROR] Cannot open pipe from "$cmd" - $!\n);

    while (<IN>) {
        chomp;

        if (m{(^.*):\s+\$$id$}) {
            print "Session name: <$1>\n";
            exit 0;
        }
    }

    print "Unable to determine TMUX session name\n";
    exit 1;
}
else {
    print "Not in a TMUX session\n";

    exit 1;
}

これにより、TMUXセッションで次の出力が生成されます。

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

TMUXセッション以外では、次のものが生成されます。

<~> $ tmuxsessionname
Not in a TMUX session

printシェルスクリプトなどでこれを使用する場合は、ステートメントを捨てて、終了コードを使用することができます。

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