私はtmuxセッションでIrssiを実行しており、誰かが私にプライベートメッセージを送信したり、私がtmuxセッションに接続していないときに私に言及したときに私に電子メールを送信するようにIrssiスクリプト(拡張)を作成しています。
これについてのすべては非常に簡単です。一つは抜けました。 tmuxセッションが接続されているかどうかを検出する方法は?
私はこれまでこれをやってきましたが、主にこれが正しい/最善の方法であるかどうかを確認するためにここに来ました。どんな提案にも感謝します!
# Get the current session_name value from tmux
$ tmux display -p '#{session_name}'
2
# Running list-clients while I'm attached yields the following,
# from both the same window as well as another window:
$ tmux list-clients -t 2
(null): 2 [180x42 (null)]
# As well, running list-clients while detached yields no output:
$ tmux list-clients -t 2
$
概して私考えるこれはこの問題を解決する正しい方法ですが、この問題を確認する方法のより良い方法や提案があればいつでも歓迎します。
答え1
いいですね。必要な部分はすでに確保しているようです。しかし、これを組み合わせて凝集力のある全体にします。
環境TMUX
変数は、現在のプロセスがtmuxで実行されているかどうかを示します。
<~> $ echo $TMUX
/private/var/folders/1s/ff98nkc90mv7pfglffklcv8w0000gn/T/tmux-501/default,27570,8
最後の値(8)はセッションID(セッション名であってもなくてもよい)です。上記の例では、セッションIDは8ですが、「8」というセッションはありません。
<~> $ tmux ls
0: 1 windows (created Sat Nov 23 21:17:45 2013) [80x23]
1: 1 windows (created Sat Nov 23 21:17:45 2013) [120x34]
bar: 2 windows (created Tue Nov 26 03:05:03 2013) [120x34] (attached)
blech: 1 windows (created Tue Nov 26 03:12:46 2013) [120x34] (attached)
ただし、-F形式の文字列を使用してtmuxからこの情報を取得できます。
<~> $ tmux ls -F "#{session_name}: (#{session_id})"
0: ($0)
1: ($1)
bar: ($5)
blech: ($8)
その後、この情報を使用して添付されていることを確認できます。
<~> $ tmux ls -F "#{session_id}: #{?session_attached,attached,not attached}"
$0: not attached
$1: not attached
$5: attached
$8: attached
すべてを一つにまとめるのに助けが必要な場合は、教えてください。
答え2
コメントにあるjasonwryanの提案に従って、次の2つのコマンドを使用するようになりました。
現在のセッション名を表示します。
私たちはスクリプト言語を使用しているので、必ずしもセッションIDを知る必要はありません。
tmux display -p '#{session_name}'
すべてのセッションを名前および対応する接続状態別にリストします。
session_attachedはブール値であり、単一の数値で表されるため、ほとんどのスクリプト言語でこの出力形式を簡単に解析できます。
# Show the session attached status for each session name. session_attached
# is a single digit, either 0 or 1, making it easy to distinguish
tmux ls -F '#{session_attached} #{session_name}'
Perl(IRSSIプラグイン)でこの出力形式を解析するには、次のようにします。
my ($attached, $name) = $line =~ /^(\d) (.+)$/;