我想设置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'
瞧!它就像一个魅力。