我的 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
请随意采用您的需求。