在 xterm 标题栏中显示命令

在 xterm 标题栏中显示命令

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

PS1='\033]0;\u@\h>\w\007'

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

答案1

基本上,您需要:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG

在你的或类似的结尾.bashrc。我花了一段时间才弄清楚——看我的回答这里了解更多信息 :)

答案2

(灵感来自这个苏答案

你可以结合一些 bash 技巧:

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

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

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG

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

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

set -o functrace

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

答案3

我从各种帖子中解决了自己的解决方案。这将创建一个包含用户、主机名、密码、tty 和当前执行的命令(对于 bash)的标题。

看起来像这样(没有执行任何命令):

.:[user@hostname:/home/user][pts/10]:.

像这样(执行命令):

.:[user@hostname:/home/user][pts/10] {tail -F /var/log/syslog}:.

在 .bashrc 的某个地方,我扩展了 PS1:

# set the terminals title. This is the "post-command" part,
# need to use a trap for pre-command (to add the command line to the title)
PS1+="\[\033]2;.:[\u@\h:\$PWD] [$(tty | cut -b 6-)]:.\007\]"

添加当前命令,使用历史1陷阱:

# set a fancy title (this is pre-command, in PS1 is after-command (to reset command)
trap 'echo -ne "\033]2;.:[${USER}@${HOSTNAME}:${PWD}] [$(tty | cut -b 6-)] {$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")}:.\007"' DEBUG

请随意采用您的需求。

相关内容