如何通过运行tmux命令知道当前的tmux会话名称


34

我正在写脚本。我真的很想知道这一点。我希望tmux可执行文件可以告诉我这一点。

我发现

tmux rename <newname>

可以重命名当前会话。但是我找不到命令来获取自己的名字。

Answers:


49

tmux 1.2(及更高版本)中,您可以使用-p选项display-message将消息输出到stdout(而不是将其显示给连接的客户端):

tmux display-message -p '#S'

#S的格式设置为会话名称(请参见status-left手册页中选项的说明)。


+1,比我的回答好得多。
chepner

我真的很感激您指出它需要tmux 1.2,这正是openSUSE 11.3自动在线更新可用的版本。
Jimm Chen'4

在tmux 1.8中,即使我不在该会话中工作,它也会返回附加会话的名称。
Mihai Danila'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。
Brian Cline

使用可接受的答案并按照此处描述的问题失败后,请回到此问题。请对此投票。如果可能,应更改接受的答案。
亚历山德罗斯

1
如果TMUX在运行tmux display-message -p '#S'典型的桌面安装程序之前与检查环境变量结合使用,则方法1可以正常工作。
ZeroPhase

8

根据don_crissti 关于“ 为什么不能按预期运行”的评论,扩展/更正了蒂姆人的回答grep -v

tim-peoples回答中的 “ $(tty)”命令

| grep“ $(tty)” |

在这种情况下无法按预期工作。它的计算结果是字符串“ not 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”问题是个b子。我不使用玩具壳:D
蒂姆·人民

1
@TimPeoples虽然可能是Bash问题。Bash仍然是针对shell脚本进行编码的标准,以实现与现代终端的兼容性。当然,posix标准是理想的。但是,bash具有所有更高级的终端共享的某些功能。通过点击Bash,其他大多数主要终端都应该可以正常工作。我只是运行shell检查并捕获了许多错误和格式问题。(主要使用旧语法代替当前更具描述性的语法)
ZeroPhase

4
  • 克里斯·约翰森(Chris Johnsen)的答案即使在外部查询时也返回会话名称。
  • 光明的一面和蒂姆·人民的答案都假设为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}'

自定义格式比默认格式容易解析。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.