Answers:
会话的名称存储在tmux变量中#S
,要在终端中访问它,您可以
tmux display-message -p "#S"
如果要在其中使用它.tmux.conf
,那就简单了#S
。请注意,该-p
选项将在stdout上打印消息,否则消息将显示在tmux状态行中。
如果在会话内部调用了上面的命令,它将返回会话的名称。如果在任何会话外部调用它,它仍将返回上一个仍在运行的会话的名称。我找不到一个tmux命令来检查一个会话是否在一个会话中,因此我不得不提出以下解决方案:
tmux list-sessions | sed -n '/(attached)/s/:.*//p'
tmux list-sessions
显示所有会话,如果已连接,则显示(attached)
在末尾。使用sed时,我们会抑制所有输出(选项-n
),除非找到关键字(attached)
,在这一行中,我们删除了a之后的所有内容:
,从而为我们保留了会话的名称。相对于,它在会话内外对我都有效tmux display-message -p "#S"
。
当然,只有在会话名称中没有:
和没有时(attached)
,此方法才有效。
正如Chris Johnsen所评论的那样,一种检查是否在tmux会话中的方法是查看其环境变量是否已设置:
[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
看看这里,通过这篇文章,我了解到,区分tmux
客户端的一件事是它们的tty
但会话名称是tmux
服务器属性,当我们从tmux
客户端内部或外部查看会话名称时,它们是相同的。接下来,我们可以使用tmux info | head
它显示客户端的pid和tty以及服务器的pid。
tmux info | grep $$ | grep -q `ps -p $$ -o tty=`
如果我们在tmux
客户端内部,则以下命令返回值为0;如果在客户端外部运行,则以下命令返回值为非零tmux
。如果从脚本运行它,请确保使用ppid而不是$$,因为tty与外壳程序进程相关联,而不是与您正在运行的脚本相关联。
一种简单的方法,但要知道我们是内部tmux
客户还是外部客户的健壮性较低,是查看TERM环境变量。似乎在客户端外部显示为“ xterm”,但在客户端内部显示为“ screen”。但是,我发现第一种方法要好得多。
这是一个perl脚本;使它成为Shell脚本或Shell脚本函数是读者的一项练习。
#!/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
语句,如果要在Shell脚本或其他内容中使用退出代码,则只需使用退出代码。
tmux
会话之外tmux
。当我键入两个命令时tmux display-message -p "#S"
,将打印相同的结果,并且两个命令的返回值相同。