如何在tmux中运行脚本并自动更新状态栏展示内容?
问题原因
你当前使用的是持续循环输出的长驻shell脚本,tmux的#()语法对未退出的长命令仅会缓存首次运行的输出,不会自动拉取后续的新输出,因此出现仅刷新一次的问题。
解决方案
方案1:修改为单次执行脚本(推荐,配置最简单)
不要将脚本写为常驻循环的形式,调整为单次执行直接输出当前IP、执行完成后立即退出的版本,再搭配tmux自带的状态栏刷新间隔参数即可实现自动更新。
- 调整你的脚本内容示例:
#!/bin/bash # 输出当前出口IP,无网络/VPN断开时返回自定义提示 curl -s --connect-timeout 2 ifconfig.me 2>/dev/null || echo "VPN Disconnected"
- 给脚本添加执行权限:
chmod +x /path/to/your/script.sh - 修改tmux配置文件(通常是
~/.tmux.conf):
# 设置状态栏每15秒刷新一次,和你需要的更新间隔对齐 set -g status-interval 15 # 在状态栏对应位置插入脚本输出,示例是添加到状态栏左侧 set -g status-left "#[fg=cyan]VPN IP: #(/path/to/your/script.sh) #[default]"
修改完成后执行tmux source ~/.tmux.conf加载配置即可生效。
方案2:使用全局环境变量传递常驻脚本输出
如果你确实需要保留脚本的常驻循环逻辑(比如要降低重复启动脚本的开销、或者要实现比全局status-interval更灵活的独立刷新频率),可以用tmux全局环境变量做中转:
- 调整你的循环脚本内容示例:
#!/bin/bash while true; do current_ip=$(curl -s --connect-timeout 2 ifconfig.me 2>/dev/null || echo "VPN Disconnected") # 将IP写入tmux全局环境变量 tmux setenv -g CURRENT_VPN_IP "$current_ip" sleep 15 done
- 给脚本添加执行权限:
chmod +x /path/to/your/loop_script.sh - 修改tmux配置文件:
# tmux启动时后台运行你的常驻脚本 run-shell -b '/path/to/your/loop_script.sh' # 状态栏直接读取全局环境变量显示 set -g status-left "#[fg=cyan]VPN IP: #{$CURRENT_VPN_IP} #[default]"
加载配置后即可生效,脚本会每15秒自动更新环境变量的值,状态栏会自动读取最新值显示。
内容的提问来源于stack exchange,提问作者itsnexn
相关产品推荐
相关产品推荐

