Shell

您如何在每次輸入時使 zsh 中的 RPROMPT 更新自身?

  • June 2, 2011

RPROMPT的設置為使用顯示 svn 資訊vcs_info。它讀取RPROMPT=${vcs_info_msg_0_}vcs_info被稱為使用precmd()。但是,當我更改目錄時,RPROMPT 不會更新。它僅在我再次呼叫提示時才有效(通過 source ~/.zshrc 或 prompt )並且不會在 chdir 上更改,除非我再次呼叫提示。有沒有辦法改變這種行為?

嘗試在分配時在變數值周圍加上單引號以延遲評估:

RPROMPT='${vcs_info_msg_0_}'

使用單引號延遲評估也適用於定義動態別名。這是一個別名,t用於將新的 shell 附加到現有的 ssh 代理程序,該程序以一個名為的別名開始,該別名ssh-start將 shell 程式碼寫入 homedir 中的文件:

mymistress:~> which ssh-start
ssh-start: aliased to eval `ssh-agent | tee ~/.ssh/ssh-agent.out` ; ssh-add ~/.ssh/id_rsa
mymistress:~> grep "alias t" .zshrc    
alias t="eval `cat ~/.ssh/ssh-agent.out`"
mymistress:~> which t
t: aliased to eval SSH_AUTH_SOCK=/tmp/ssh-nZBZp29804/agent.29804; export SSH_AUTH_SOCK;\nSSH_AGENT_PID=29805; export SSH_AGENT_PID;\necho Agent pid 29805;`

的定義t很糟糕,因為它會導致新執行的新資訊ssh-start被忽略。將別名定義更改為t在我的 .zshrc 中單獨引用可以提供更好的行為:

mymistress:~> grep "alias t" .zshrc
alias t='eval `cat ~/.ssh/ssh-agent.out`'
mymistress:~> source ~/.zshrc
mymistress:~> which t
t: aliased to eval `cat ~/.ssh/ssh-agent.out`

注意tas 提供的定義的擴展which t,顯示了雙引號(命令或環境變數的立即就地擴展)與單引號(命令和變數的延遲評估)的效果。

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