如何使Xterm窗口标题在当前运行命令和当前路径之间切换?

如何使Xterm窗口标题在当前运行命令和当前路径之间切换?

我想设置Xterm窗口标题在两种状态之间切换:

  • 当命令运行时,显示命令名称(例如“less”)
  • 当没有命令运行时,显示当前路径(例如“src”)

我可以使用当前路径创建一个 Xterm 窗口标题:

$ export PROMPT_COMMAND='echo -ne "\033]0;`basename ${PWD}`\007"'

我可以展示当前运行命令通过添加一条trap语句.bashrc

$ trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG

但我无法在两者之间自动切换。是否可以?

编辑:@特登显示了一个在常规 xterm 中工作的解决方案,太酷了!但我没有提到我使用 MacOSX Terminal.app。当没有命令运行时,这表明仍然显示“bash”而不是当前路径。稍微修补一下我想出了如何解决这个问题

答案1

$BASH_COMMAND如果您使用检查是否已设置并在未设置时打印 CWD 的函数,则可以执行此操作。将这些行添加到您的~/.bashrc

trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG
function show_name(){ 
    if [[ -n "$BASH_COMMAND" ]]; 
    then 
    echo -en "\033]0;`pwd`\007"; 
    else 
    echo -en "\033]0;$BASH_COMMAND\007"; 
    fi 
}
export PROMPT_COMMAND='show_name'

这将使您的终端名称成为当前正在运行的命令(如果有)或当前目录(如果没有)。请记住,如果您运行一个多次运行命令的长循环,这将导致稍微精神分裂的终端。while true; do echo foo; done例如尝试一下。

如果你正在使用zsh这个更容易实现(来源)并且它正确处理循环:

case $TERM in
    xterm*)
      preexec () {
        print -Pn "\e]0;$*\a"
      }
    ;;
esac

答案2

我意识到MacOSX Terminal.app 无法读取 .bashrc。在一些帮助下如何提取字符串的第一个单词并做了一些修改,我调整了@terdon 很好的答案将以下内容添加到.bash_profile

trap 'echo -ne "\033]0;${BASH_COMMAND%% *}\007"' DEBUG

function show_name { 
    if [[ -n "$BASH_COMMAND" ]]; then
      echo -en "\033]0;`basename ${PWD}`\007"
    fi 
}
export PROMPT_COMMAND='show_name'

瞧!它就像一个魅力。

相关内容