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

Jim*_*hen 41 tmux

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

我发现

tmux rename <newname>
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*sen 58

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

tmux display-message -p '#S'
Run Code Online (Sandbox Code Playgroud)

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


小智 13

我很惊讶,在将近 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}'
Run Code Online (Sandbox Code Playgroud)

无论 tmux 会话的数量(附加或其他)如何,无论当前终端会话是否是 tmux 会话的一部分,这都有效。

  • 很好的答案。除了遍历每个会话名称以列出其窗格之外,您还可以使用 `tmux list-panes -a -F '#{pane_tty} #{session_name}'` 来列出每个会话的窗格。不确定`-a`有多新,所以YMMV。 (3认同)
  • 如果在为典型的桌面设置运行 `tmux display-message -p '#S'` 之前结合检查 `TMUX` 环境变量,方法 1 可以正常工作。 (2认同)

bri*_*ide 9

根据don_crissti 关于为什么这不能按预期运行的评论,扩展/更正了tim-peoples 的回答.grep -v

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

| grep "$(tty)" |

在这种情况下不会按预期工作。它评估为字符串“不是 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}'
Run Code Online (Sandbox Code Playgroud)

  • @TimPeoples 虽然这可能是 Bash 问题。为了在现代终端上兼容,Bash 仍然是编写 shell 脚本的标准。当然,posix 标准是理想的;但是,bash 具有所有更高级的终端共享的一些功能。通过点击 Bash,大多数其他主要终端应该可以正常工作。我只是运行 shell check 并发现一堆错误和格式问题。(主要使用旧语法代替当前更具描述性的语法) (2认同)

dse*_*t0x 5

  • 即使从外部查询,Chris Johnsen 的回答也会返回会话名称。
  • 光明的一面和蒂姆·人民的回答假设tty.

相反,我发现这对我来说很准确:

if [[ -n "$TMUX_PANE" ]]; then
    session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi
Run Code Online (Sandbox Code Playgroud)