如何通过运行 tmux 命令了解当前 tmux 会话名称

如何通过运行 tmux 命令了解当前 tmux 会话名称

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

我发现

tmux rename <newname>

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

答案1

tmux1.2(及更高版本),您可以使用选项-pdisplay-message消息输出到 stdout(而不是将其显示给附加的客户端):

tmux display-message -p '#S'

#Sstatus-left被格式化为会话名称(请参阅手册页中该选项的描述)。

答案2

令我惊讶的是,近 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 会话的一部分,这都可以工作。

答案3

扩展/更正tim-peoples 的回答 按照don_crissti 的评论为什么这grep -v没有按预期运行?

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

| grep “$(tty)” |

在该上下文中不会按预期工作。它计算结果为字符串“not a 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}'

答案4

不太理想,但您可以使用以下命令提取附加会话的名称awk

tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'

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

相关内容