在 xterm 标题栏中显示命令

dog*_*ane 25 bash prompt xterm window-title

我的 Bash Prompt 当前正在使用以下顺序设置 xterm 标题栏:

PS1='\033]0;\u@\h>\w\007'
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以在标题栏中显示当前命令。例如,如果我使用 拖尾文件tail -f foo.log,我希望我的标题栏显示tail -f foo.log.

sim*_*mon 19

基本上,您需要:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG
Run Code Online (Sandbox Code Playgroud)

在你的.bashrc或类似的结尾。我花了一段时间才解决这个问题——请在此处查看我的答案以获取更多信息:)

  • @orschiro,建议将`trap` 命令*作为单独的命令* 运行,而不是将其分配给PS1。 (2认同)

Mic*_*zek 13

(灵感来自这个 SU 答案

您可以结合使用几个 bash 技巧:

  • 如果捕获 DEBUG 信号,则在执行每个命令之前调用处理程序
  • 变量$BASH_COMMAND保存当前正在执行的命令

因此,捕获 DEBUG 并让处理程序将标题设置为$BASH_COMMAND

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG
Run Code Online (Sandbox Code Playgroud)

这将保持标题更改,直到其他内容更改它,但只要您$PS1保持不变,它就不会成为问题 - 您启动命令,DEBUG 处理程序更改标题栏,当命令完成时 bash 绘制一个新的提示并再次重置您的标题栏。

这里找到的一个有用的提示(也是 SU 答案的来源)包括:

set -o functrace
Run Code Online (Sandbox Code Playgroud)

这将使 bash 将 DEBUG 陷阱传播到您启动的任何子shell;否则标题栏不会在其中更改