ale*_*der 5 grep prompt zsh tmux
我正在尝试找到一种方法来检查 tmux 服务器是否正在运行,以便使用该信息更新我的 zsh 提示。
> 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对我来说没用,因为我不想知道我是否在会话中而已经在会话中,这是毫无意义的。我想知道服务器是否为alive或dead,无论我是否连接到会话。
额外(仅适用于 zsh 用户)
如果你想把 tmux 服务器状态放在你的 zsh 提示中,这就是我得到的:

要得到这个,只需将这些行添加到您的 .zshrc
> tmux ls > file.txt
no server running on /tmp/tmux-1000/default
Run Code Online (Sandbox Code Playgroud)
内容:
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如果没有可用的会话,该命令将在那里输出一条错误消息,但我们对该消息不感兴趣。
| 归档时间: |
|
| 查看次数: |
348 次 |
| 最近记录: |