如何检测 tmux 是否已连接?

如何检测 tmux 是否已连接?

我有一个 Irssi 在 tmux 会话中运行,并且正在编写一个 Irssi 脚本(扩展),以便在有人私信或在我未附加到 tmux 会话时提及我时向我发送电子邮件。

关于这一切都非常简单,少了一件事:如何检测 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 在评论中的建议,我最终得到了以下两个命令。

显示当前会话名称。

由于我们使用的是脚本语言,因此我们不一定需要知道会话 ID。

tmux display -p '#{session_name}'

按名称列出所有会话及其各自的附加状态。

session_attached 是一个 bool,并表示为单个数字,使大多数脚本语言可以轻松解析此输出格式。

# 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) (.+)$/;

相关内容