tmux切换/创建窗格时脚本echo内容异常显示问题求助
问题解决:tmux状态栏脚本输出异常显示在终端的修复方案
问题分析
你的脚本在新建窗口时正常,但切换/创建窗格时,脚本的echo内容会直接显示在终端,核心原因有三点:
- 脚本中使用的tmux变量
#S无法被解析(#(~)是独立执行脚本,tmux不会解析脚本内部的#S,且bash会将#视为注释开头,导致输出内容异常); - 脚本用
echo输出会产生多余换行,可能引发tmux解析错误; - 脚本部分命令的stderr未被重定向,可能在窗格切换时泄露输出。
修复步骤
1. 替换echo为printf避免多余换行
将脚本中所有echo改为printf,确保输出无多余换行符,避免tmux错误输出到终端:
- 修改
get_git_branch函数:
get_git_branch() { local branch if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then branch=$(git symbolic-ref --short HEAD 2>/dev/null) printf "%s" "$branch" else printf "" fi }
- 修改
clock函数:
clock() { printf "%s" "$(date "+%a %e %b %-I:%M %p")" }
2. 正确获取tmux会话名
通过tmux display-message命令主动获取会话名,替代无法解析的#S变量:
修改no_branch_status函数:
no_branch_status(){ local session_name=$(tmux display-message -p "#S" 2>/dev/null) printf "#[fg=colour072]session(#[fg=colour35]%s#[fg=colour072]) #[fg=colour072]| #[fg=colour067,bold]%s#[default]" "$session_name" "$(clock)" }
同时在分支显示的代码块中使用相同方式获取会话名:
if [ -n "$git_branch" ]; then local session_name=$(tmux display-message -p "#S" 2>/dev/null) printf "#[fg=colour072]session(#[fg=colour35]%s#[fg=colour072]) #[fg=colour223] %s #[default]" "$session_name" "$git_branch" else no_branch_status fi
3. 重定向脚本stderr避免错误输出
在脚本开头添加一行,将整个脚本的stderr重定向到/dev/null,防止错误信息泄露到终端:
#!/bin/bash exec 2>/dev/null
4. 确保脚本可执行
如果未设置权限,执行以下命令:
chmod +x ~/.tmux/plugins/mine/vim-git-branch.sh
完整修改后的脚本
#!/bin/bash exec 2>/dev/null get_git_branch() { local branch if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then branch=$(git symbolic-ref --short HEAD 2>/dev/null) printf "%s" "$branch" else printf "" fi } clock() { printf "%s" "$(date "+%a %e %b %-I:%M %p")" } no_branch_status(){ local session_name=$(tmux display-message -p "#S") printf "#[fg=colour072]session(#[fg=colour35]%s#[fg=colour072]) #[fg=colour072]| #[fg=colour067,bold]%s#[default]" "$session_name" "$(clock)" } current_dir="$(tmux display-message -p "#{pane_current_path}")" cd "$current_dir" || exit 1 if [ "$(tmux display-message -p "#{pane_current_command}")" = "vim" ]; then git_branch=$(get_git_branch) if [ -n "$git_branch" ]; then local session_name=$(tmux display-message -p "#S") printf "#[fg=colour072]session(#[fg=colour35]%s#[fg=colour072]) #[fg=colour223] %s #[default]" "$session_name" "$git_branch" else no_branch_status fi else no_branch_status fi
最后加载配置
执行命令重新加载tmux配置:
tmux source-file ~/.tmux.conf
内容的提问来源于stack exchange,提问作者MAK
相关产品推荐
相关产品推荐

