Bash:PS1 與提示指令設定提示與標題

Bash:PS1 與提示指令設定提示與標題

以下選項在設定提示和終端標題的效能/效率方面有很大差異嗎? (除了額外的調用echo

  1. 將 PS1 設定為命令的輸出:
PS1="\$(my_fun)"
my_fun() {
  echo "my prompt"
}
  1. 用於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
  • 使用什麼來設定終端標題也並不重要,因為它無論如何都不計入提示寬度。

相關內容