我每晚使用 iTerm 2,左侧状态栏有以下 tmux 配置设置:
set -g status-left "#[fg=green]#h @ #[fg=cyan]#(extip | awk '{print \"ip \" $1}') #[fg=yellow]#(ifconfig en0 | grep 'inet ' | awk '{print \"en0 \" $2}') #[fg=red]#(ifconfig tun0 | grep 'inet ' | awk '{print \"vpn \" $2}'"
它应该打印我的外部 IP,en0
以及我的 VPN 连接(如果已连接)。extip
是我自己编写的工具,但已经很长一段时间没有接触过,并且它在命令行中工作得很好(并且我可以看到在附加调试器时它被调用并正确返回)。直到几周前,一切都运行良好,从那时起,它只是显示<'extip | awk '{print "ip " $1}'' not ready>
而不是我的外部 IP 地址。其余部分仍然完美运行,没有任何问题。起初我以为这只是 iTerm nightly 不稳定,但经过几次更新后它仍然无法工作,所以我觉得也许根本不应该这样做,只是出于某种侥幸而已?谁能给我一些关于为什么它可能停止工作以及如何让它再次工作的指示?
答案1
https://github.com/tmux/tmux/issues/733#issuecomment-277230881提到
未就绪消息是正常的,tmux 告诉您命令尚未完成运行,命令完成后它将立即显示输出
从 Ubuntu 16.04 升级到 16.10 后,我用我的脚本看到了这一点,该脚本以窗口状态格式显示 ssh 服务器 - 连接时它会闪烁。事实上,我可以通过这样做来重现它
tmux setw -g window-status-current-format '#(echo `tmux display-message -p "#W #{pane_pid}"`)'
然后ssh aslkfdsdkljfslkdsajf
,在尝试连接时它会闪烁。
我猜extip
需要一段时间才能返回结果;如果将其替换为仅执行echo 1
or操作的 shell 脚本,会发生什么情况sleep 1; echo 1
?
(另请注意,tmux 应该缓存任何命令,一旦它们在该窗口/窗格中至少执行一次,但如果命令本身发生更改 - 正如我上面的示例 - 它不会使用缓存。我已经提交了错误报告关于在这种情况下静音“未准备好”命令。)
答案2
我过去曾通过使用基本display-message
命令(例如"Welcome, $USER..."
)实例化 tmux 来解决这个问题,这似乎给了它一秒钟左右的时间来第一次运行外部应用程序。
当然,取决于您的需求。我在我的配置文件脚本中启动 tmux,但是,如果您按需运行 tmux,您可能会使用别名......
# /usr/bin/tmux -V
tumx 2.4
# /usr/bin/tmux new-session \; display-message "Welcome, $USER..."