bash - 如何在 tmux Pane 标题中显示当前命令

标签 bash tmux

我想用当前执行的命令更新 tmux Pane 标题,或者如果没有命令,则更新当前 shell 的名称。到目前为止,我在 bashrc 中想到的是:

case ${TERM} in

  screen*)       
    PROMPT_COMMAND='printf "\033]2;bash\033\\"'
    set -o functrace
    trap 'echo -ne "\033]2;$BASH_COMMAND\033\\"' DEBUG
    ;;

   ...

esac

方法来源于这里: http://www.davidpashley.com/articles/xterm-titles-with-bash.html

这部分工作 - 它做了需要的但会导致其他问题:新 shell 中的第一个提示以

为前缀
"'"' DEBUG"

和所有剩余的命令

"

它还可以防止在命令行上给出的一些命令失败,例如:

$ ps -h $$
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html

因此,虽然上面确实允许当前命令显示在 tmux Pane 标题中,但它不起作用。有没有其他人对此有更好的解决方案,或者对上述问题有何建议?

谢谢。

最佳答案

这是每次在 BASH 中执行命令时更新 tmux Pane 标题的一种方法。将如下代码放入~/.bashrc:

case ${TERM} in

    screen*)

        # user command to change default pane title on demand
        function title { TMUX_PANE_TITLE="$*"; }

        # function that performs the title update (invoked as PROMPT_COMMAND)
        function update_title { printf "\033]2;%s\033\\" "${1:-$TMUX_PANE_TITLE}"; }

        # default pane title is the name of the current process (i.e. 'bash')
        TMUX_PANE_TITLE=$(ps -o comm $$ | tail -1)

        # Reset title to the default before displaying the command prompt
        PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'update_title'   

        # Update title before executing a command: set it to the command
        trap 'update_title "$BASH_COMMAND"' DEBUG

        ;;

        ... other cases for different terminals ...

esac

update_title 函数打印更改 tmux Pane 标题的转义序列。它将 Pane 标题设置为默认值($TMUX_PANE_TITLE 的值)或作为参数给出的任何值。

title 函数是为了方便最终用户:它更改了 $TMUX_PANE_TITLE 中默认标题的值。最终用户可以随时通过以下方式将标题更改为他们想要的任何内容:

$ title my new pane title

初始标题设置为运行 shell 的名称(即“bash”)。

Bash 在显示提示之前执行 $PROMPT_COMMAND 中的任何内容。这是为了在每次提示之前执行 update_title 函数以将提示设置为默认标题。

陷阱导致 Bash 在执行任何命令之前执行 $BASH_COMMAND。它被设置为在每个命令之前执行 update_title 函数以将提示设置为该命令的文本。

其他注意事项

  • 在解决这个问题时,我发现 set -o functraceset -T(如问题中链接的人所述)导致 RVM休息。建议的原因是允许在子 shell 中更改提示,但缺少这个对我来说不是问题。

  • 为了获得最初的标题,我想使用更简洁的 ps -ho comm $$ 但这似乎无法在 tmux 中使用上述内容。我不确定为什么选择其他有效的方法。

关于bash - 如何在 tmux Pane 标题中显示当前命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14356857/

相关文章:

bash - 同一行的 echo 输出

tmux - 使用 tmux 移动到行尾的设置

linux - 无法增加 tmux 中的回滚缓冲区大小

bash - 在 POSIX shell 脚本中嵌入 Unicode 字符的最佳方法是什么?

linux - sh/bash 命令替换卡住脚本

c - 使用 execl 获取 grep 值

json - 如何用jq提取一个json值子串

python - tmux识别了Conda env,但仍使用默认的python

ssh - 如何强制 `vagrant ssh` 进行伪 tty 分配?

bash - 防止tmux的pane_title被更新