一尘不染

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

linux

在Ubuntu的终端上,我经常运行长时间运行的程序。而且由于有很多这样的程序,除非我将所有这些选项卡一一列出,否则我一直忘了哪个终端适用于哪个程序。因此,我想找到一种方法,无论何时运行命令,都将我的终端标题更新为程序名称。我不想手动做。

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


阅读 275

收藏
2020-06-07

共1个答案

一尘不染

我为您提供了一些答案:)您说对了,使用gnome-
terminal无关紧要,但是使用什么命令外壳都没有关系。在中zsh,这要容易得多,但是在接下来的内容中,我将假设您正在使用bash,并且它是一个相当新的版本(>
3.1)。

首先:

哪个环境变量将包含当前的“命令”?

有一个环境变量,它或多或少具有您想要的-
$BASH_COMMAND。只有一个小障碍,那就是它只会向您显示管道中的最后一条命令。我不是100%不确定子壳组合会做什么:)

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

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

在中bash,我可以想到的唯一实现目标的方法是(ab)使用DEBUG SIGNAL。所以这是一个解决方案-将此粘贴在您的末尾.bashrc

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

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

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

但我不保证它是完美的!

2020-06-07