在xterm标题栏中显示命令


23

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

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

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

Answers:


16

基本上,您需要:

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

在您.bashrc或类似人的末尾。我花了一段时间来解决这一问题-见我的答案在这里了解更多信息:)


simon感谢您的解决方案!但是,将其添加到.bashrc我的shell中的每个命令之后之后,我会得到此输出0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}。我假设可以通过将trap命令分配给PS1?来抑制此输出。但是,PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG不起作用。导致错误bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found
orschiro 2013年

顺便说一句,我刚进入了stackoverflow.com/questions/48407130/…,大概是因为这个建议被应用而问到。陷阱应该直接写到stderr或TTY,而不是stdout。
查尔斯·达菲

1
@orschiro,建议将该trap命令作为单独的命令运行,而不要将其分配给PS1。
查尔斯·达菲

12

(受此SU回答启发)

您可以结合一些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。否则标题栏将不会在其中更改


哈!完全相同的时间!+1用于处理子外壳,但是您对管道问题有任何答案吗?(请参阅我与SO问题的链接)
simon

无法正常工作ssh
深渊。

也“杀死”“制表符”上的完成内容
深渊。

顺便说一句,我刚进入了stackoverflow.com/questions/48407130/…,大概是因为这个建议被应用而问到。陷阱应该直接写到stderr或TTY,而不是stdout。
查尔斯·达菲

重定向到/dev/ttystderr 会更好吗?
亚伦·迪古拉

2

我从各种各样的帖子中探讨了自己的解决方案。这将创建一个标题,其中包含用户,主机名,pwd,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\]"

使用历史记录1trap添加当前命令:

# 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

随时采用您的需求。


顺便说一句,我刚进入了stackoverflow.com/questions/48407130/…,大概是因为这个建议被应用而问到。陷阱应该直接写到stderr或TTY,而不是stdout。
查尔斯·达菲
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.