Bash
如何讓 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
但我無法在兩者之間自動切換。是否可以?
編輯:@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