注意:我还没有标记这个 薄荷味或者赛格威 保持它的普遍性,因为我通常发现像这样的东西, 狂欢/Linux的 解决方案往往可以与 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 上测试过。