以下選項在設定提示和終端標題的效能/效率方面有很大差異嗎? (除了額外的調用echo
)
- 將 PS1 設定為命令的輸出:
PS1="\$(my_fun)"
my_fun() {
echo "my prompt"
}
- 用於
PROMPT_COMMAND
直接設定PS1:
PROMPT_COMMAND=_prompt_command
_prompt_command() {
PS1="my prompt"
}
答案1
效率:
PS1="$(fun)"
將呼叫該函數就一次(當解析賦值時)並將使用子shell進程。如果輸出完全靜態,這是最有效的選擇。PROMPT_COMMAND=fun
將呼叫該函數每次(每當顯示提示時)並將在主 shell 進程中運行它。PS1="\$(fun)"
將呼叫該函數每次(每當顯示提示時)並且每次都會產生子shell進程,使其效率低於PROMPT_COMMAND(但有時是必要的;請參閱下一節。)
正確性:
- 的內容
PS1
提供給 Readline,使其能夠了解提示寬度,並在輸入不再適合單行時正確換行。當從 PS1 呼叫函數時(例如PS1="\$(foo)"
),您需要用\001
和來包裝不可見序列\002
,而不是通常的\[
和\]
。 - 結果
PROMPT_COMMAND
直接顯示在螢幕上,Readline 不知道。如果您嘗試專門使用此方法(即與空一起使用PS1=""
),您會注意到,一旦輸入長度超過一行,遊標將不再有意義,並且您無法再從第 2 行退格到第 1 行。 - 對於多行 shell 提示符,前面的行如何顯示並不重要,只要最後的線仍然顯示通過
PS1
。 - 使用什麼來設定終端標題也並不重要,因為它無論如何都不計入提示寬度。