Bash

如何讓 Xterm 視窗標題在目前執行命令和目前路徑之間切換?

  • December 3, 2015

我想將 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

但我無法在兩者之間自動切換。是否可以?

編輯:@terdon展示了一個在正常 xterm 中工作的解決方案,這很酷!但我沒有提到我使用的是 MacOSX Terminal.app。當沒有命令執行時,它仍然顯示“bash”而不是目前路徑。經過一番修修補補,我想出瞭如何解決這個問題

我意識到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'

瞧!它就像一個魅力。

如果您使用檢查是否$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它更容易實現(source)並且它可以正確處理循環:

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

引用自:https://unix.stackexchange.com/questions/91555