Bash - 通过运行第二个命令来更新终端标题

Neo*_*Neo 22 linux bash shell terminal

在Ubuntu的终端上,我经常运行程序,这些程序会持续运行很长时间.由于有很多这些程序,我一直忘记哪个终端是哪个程序,除非我通过所有这些程序.因此,每当我运行命令时,我想找到一种方法将终端标题更新为程序名称.我不想手动做.

我使用gnome-terminal,但答案不应该真正依赖于它.基本上,如果我能够运行第二个命令,那么我可以简单地使用gconftool命令来更新标题.所以我希望找到一种方法来捕获bash中的命令并在每个命令后更新标题.我怎么做?

sim*_*mon 22

我有一些答案:)你是对的,你使用gnome-terminal并不重要,但是你使用的是什么命令shell并不重要.这样做容易得多zsh,但接下来我会假设你正在使用bash它,而且它是一个相当新的版本(> 3.1).

首先:

哪个环境变量包含当前的'命令'?

有一个环境变量,或多或少你想要的 - $BASH_COMMAND.只有一个小故障,它只会显示管道中的最后一个命令.我不是100%肯定它会用子壳组合做什么,要么:)

所以我希望找到一种方法来捕获bash中的命令并在每个命令后更新标题.

我一直在考虑这个,现在我明白你想做什么,我意识到真正的问题是你需要每个命令之前更新标题.这意味着$PROMPT_COMMAND$PS1环境变量作为可能的解决方案,因为它们仅命令返回执行.

bash,我能想到实现你想要的唯一方法是(ab)使用DEBUG SIGNAL.所以这是一个解决方案 - 在你的结尾处坚持下去.bashrc:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG
Run Code Online (Sandbox Code Playgroud)

为了解决管道问题,我一直在搞乱这个问题:

function settitle () {
    export PREV_COMMAND=${PREV_COMMAND}${@}
    printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"
    export PREV_COMMAND=${PREV_COMMAND}' | '
}

export PROMPT_COMMAND=${PROMPT_COMMAND}';export PREV_COMMAND=""'

trap 'settitle "$BASH_COMMAND"' DEBUG
Run Code Online (Sandbox Code Playgroud)

但我不保证它是完美的!

  • 因此,这对我有用,但仅在一定程度上:在命令运行时标题更新,然后在命令完成后恢复为标准标题。有没有办法让它坚持到下一个命令?PS - 可能不相关,但我不得不把它放在 .bash_profile 中,因为我无法让 Git Bash 运行 .bashrc ... (2认同)

Joh*_*lor 13

试试这个:

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

感谢history 1它的工作,即使复杂的表达式,如:

true && (false); echo $? | cat
Run Code Online (Sandbox Code Playgroud)

对于哪些方法依赖于$ BASH_COMMAND或$ @失败.例如西蒙的展示:

true | echo $? | cat
Run Code Online (Sandbox Code Playgroud)

感谢Gilles和simon提供的灵感.


UpA*_*dam 6

我看到stoutie正在尝试做什么,除了它比需要的工作多得多.并且不会导致由于重新定义'cd'而导致的所有其他潜在的坏事,并且只是为了更改目录而进行所有测试.Bash已经为大部分内容提供了支持.

在设置当前的PS1提示后,您可以将它放在.bashrc中(这样它只是预先设置)

# If this is an xterm set the titlebar to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac
Run Code Online (Sandbox Code Playgroud)


Sør*_*org 5

OP 要求bash,但其他人可能有兴趣了解(如上所述)使用zshshell确实要容易得多。例子:

# Set window title to command just before running it.
preexec() { printf "\x1b]0;%s\x07" "$1"; }

# Set window title to current working directory after returning from a command.
precmd() { printf "\x1b]0;%s\x07" "$PWD" }
Run Code Online (Sandbox Code Playgroud)

preexec, 中$1包含键入的命令(需要启用 shell 历史记录,这似乎是一个合理的假设)、$2扩展命令(shell 别名等)和$3“非常扩展”命令(shell 函数体)。(更多的)