在Ubuntu的终端上,我经常运行长时间运行的程序。而且由于有很多这样的程序,除非我将所有这些选项卡一一列出,否则我一直忘了哪个终端适用于哪个程序。因此,我想找到一种方法,无论何时运行命令,都将我的终端标题更新为程序名称。我不想手动做。
我使用gnome- terminal,但是答案不应该真的依赖于此。基本上,如果我能够运行第二条命令,那么我只需使用gconftool命令来更新标题。所以我希望找到一种方法来捕获bash中的命令并在每个命令之后更新标题。我怎么做?
我为您提供了一些答案:)您说对了,使用gnome- terminal无关紧要,但是使用什么命令外壳都没有关系。在中zsh,这要容易得多,但是在接下来的内容中,我将假设您正在使用bash,并且它是一个相当新的版本(> 3.1)。
zsh
bash
首先:
哪个环境变量将包含当前的“命令”?
有一个环境变量,它或多或少具有您想要的- $BASH_COMMAND。只有一个小障碍,那就是它只会向您显示管道中的最后一条命令。我不是100%不确定子壳组合会做什么:)
$BASH_COMMAND
所以我希望找到一种方法来捕获bash中的命令并在每个命令之后更新标题。
我一直在考虑这个问题,现在我了解了您想做什么,我意识到真正的问题是您需要 在 每个命令 之前 更新标题。这意味着$PROMPT_COMMANDand $PS1环境变量是不可能的解决方案,因为它们仅 在 命令返回 后 执行。
$PROMPT_COMMAND
$PS1
在中bash,我可以想到的唯一实现目标的方法是(ab)使用DEBUG SIGNAL。所以这是一个解决方案-将此粘贴在您的末尾.bashrc:
.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
但我不保证它是完美的!