如何使用其中运行的最后一个命令来更新终端标题?

如何使用其中运行的最后一个命令来更新终端标题?

注意:我还没有标记这个 或者 保持它的普遍性,因为我通常发现像这样的东西, / 解决方案往往可以与 Mintty/Cygwin 解决方案互换,但如果答案是 Mintyy/Cygwin 特定的,我会改变这些解决方案。


我在 Windows 10 上运行 Cygwin,并且随时打开多个 Mintty 终端运行不同的命令。如果能够一目了然地看到每个终端中最后运行了哪个命令,而不必打开每个终端进行检查,那就太好了。

我发现最接近我自己的问题是这个适用于 Ubuntu,但其解决方案如下:

trap 'echo -ne "\033]2;$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")\007"' DEBUG

...仅在命令运行时将命令添加到标题 - 这不是我想要的,因为我需要能够看到我在终端中运行的最后一个命令,无论它是否已经运行完成。

这可能吗bash

答案1

PS1可能会重置标题。例如,在我的情况下是

\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$

(带有尾随空格),其中\e]0;\w\a是造成该现象的原因。您想摆脱这个片段(及其\[ \]周围):

PS1='\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '

现在它应该可以工作了。

…除非终端仿真器干扰。我在 Kubuntu 中的 Konsole 确实会干扰:它bash在命令完成后显示在标题中,无论是否PS1重置标题。它如何知道正确的时刻并不重要。我测试了 xterm,它不会干扰。Windows 中的 Mintty 不会干扰,因此修改PS1可能是您唯一需要的东西。

考虑通过以下方式更改标题PS1以表明命令已完成:

# quick and dirty example
trap '
   _LASTCOM="$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")"
   printf "\e]0;%s\a" "$_LASTCOM"
   ' DEBUG
PS1='\[\e]0;*$_LASTCOM\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '

在 trap 中,我将相关字符串存储在一个变量中,因此可以在PS1不运行sed第二次的情况下重复使用它。我将您的 更改echo -e为,因此不会解释printf来自 扩展的反斜杠转义字符(如果有) 。$_LASTCOM

答案2

PS1一旦命令返回,就更改提示。PS0在这种情况下更为合适,因为它在执行命令之前更改提示。

首先要删除PS1设置窗口标题的位,它看起来像\[\e]0;<some string>\a\]。否则每次命令返回时PS1都会覆盖窗口标题。

我发现使用 bash 函数来设置更容易PS0

function current_command {
    local history_line="$(history 1)"
    echo "${history_line##*([[:space:])+([[:digit:]])+([[:space:]])}"
}

PS0='\[\e]0;$(current_command)\a\]'
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

它已在 debian/xterm 上测试过。

相关内容