当没有 tmux 服务器运行时,我无法 grep tmux ls 输出

ale*_*der 5 grep prompt zsh tmux

我正在尝试找到一种方法来检查 tmux 服务器是否正在运行,以便使用该信息更新我的 zsh 提示。

当 tmux 服务器处于活动状态时

> tmux ls
0: 1 windows (created Sat Jul 10 13:47:36 2021) (attached)
Run Code Online (Sandbox Code Playgroud)

所以我可以grep那个输出,对吗?

grepping该输出:

> tmux ls | grep -i "windows"
0: 1 windows (created Sat Jul 10 13:47:36 2021)
Run Code Online (Sandbox Code Playgroud)

windows被着色red(对我来说),或者你终端中的任何颜色,所以命令有效。

我选择windows是因为这个词会一直出现在tmux ls输出中。

现在检查服务器是否离线

杀死 tmux 服务器后:

tmux kill-server
Run Code Online (Sandbox Code Playgroud)

现在我检查服务器是否还活着 tmux ls

> tmux ls
no server running on /tmp/tmux-1000/default
Run Code Online (Sandbox Code Playgroud)

正常输出,符合预期。

grep似乎当TMUX服务器是死的时候失败; 检查这个奇怪的事情:

> tmux ls | grep -i "windows"
no server running on /tmp/tmux-1000/default
Run Code Online (Sandbox Code Playgroud)

exit code 此命令的:

> echo $?
1
Run Code Online (Sandbox Code Playgroud)

这意味着 grepfailed获取输出。

另一个显示奇怪的测试用例

> echo $?
1
Run Code Online (Sandbox Code Playgroud)

no server ... bla bla无论您运行什么,它始终在屏幕上打印。

当catting文件时:

> cat file.txt

Run Code Online (Sandbox Code Playgroud)

那里空无一物

我如何检查 tmux 服务器是否正在运行以使用该信息更新我的 zsh 提示?

注意:变量$TMUX对我来说没用,因为我不想知道我是否在会话中而已经在会话中,这是毫无意义的。我想知道服务器是否为alivedead,无论我是否连接到会话。

额外(仅适用于 zsh 用户)

如果你想把 tmux 服务器状态放在你的 zsh 提示中,这就是我得到的: 在此处输入图片说明

要得到这个,只需将这些行添加到您的 .zshrc

> tmux ls > file.txt
no server running on /tmp/tmux-1000/default
Run Code Online (Sandbox Code Playgroud)

内容:

  • 每次在终端中按 Enter 时都会调用的函数
  • 具有 tmux 服务器状态的变量
  • 函数中更新的提示
  • 确保将函数添加到precmd_functionsorder 中,以便在每个输入命令之前调用

关闭服务器后按回车键时,您将立即看到更新

Kus*_*nda 13

您的困惑来自这样一个事实,即tmux与所有其他实用程序一样,将错误消息和其他诊断消息写入标准错误流而不是标准输出流。使用>重定向,您只能重定向标准输出流,而不是错误消息。同样,当您通过管道传输命令的输出时,您只会通过管道传输标准输出流,而不是错误消息。这是设计使然。

但是,您不需要在grep这里做任何事情,而是可以依靠调查tmux自身的退出状态。

有一个存在的has-session子命令tmux,仅用于告诉您会话是否存在(或特定会话是否存在):

has-session[ -t target-session]
(别名:has

如果指定的会话不存在,则报告错误并以 1 退出。如果确实存在,则以 0 退出。

这意味着你可以使用

if tmux has-session 2>/dev/null; then
    echo session exists
else
    echo no sessions
fi
Run Code Online (Sandbox Code Playgroud)

这依赖于调查的存在状态,tmux has-session不需要解析特定字符串的命令输出。

我们将错误流重定向到/dev/null以使用2>/dev/null. tmux如果没有可用的会话,该命令将在那里输出一条错误消息,但我们对该消息不感兴趣。