Bash

在 PS1 中未擴展 Bash 提示特殊字元

  • May 3, 2019

我正在嘗試PS1根據執行時條件設置我的環境變數,所以我使用它PROMPT_COMMAND來這樣做。假設我想根據$?值更改我的 bash 提示符,我.bashrc將如下所示:

function prompt_command() {
   if [ $? -eq 0 ]; then
       BASH_PROMPT="\W --->"
   else
       BASH_PROMPT="[\t][\u][\w] -x->"
   fi;
}

PROMPT_COMMAND=prompt_command
PS1='${BASH_PROMPT} '

我想使用Bash Prompt Escape Sequences。不幸的是,這不起作用,因為值按原樣顯示。

另外,我需要使用中間BASH_PROMPT變數,因為某些工具正在修改該PS1值。例如,在進入虛擬環境(venv)時,PS1PS1在.prompt_command``(venv)

為什麼這些特殊值沒有正確擴展,是否有不意味著產生子外殼的解決方法?

為什麼這些特殊值沒有正確擴展?

man 1 bash說:

Bash 允許通過插入一些反斜杠轉義的特殊字元來自定義這些提示字元串,這些特殊字元被解碼

$$ … $$

(在你的情況\t\u,,,,\w\W

字元串解碼後,通過參數擴展進行擴展,

$$ … $$

所以\t等首先被解碼(但你的PS1!),${BASH_PROMPT}稍後被擴展。從這個擴展中,你的反斜杠轉義的特殊字元出現了,但解碼為時已晚。


是否有不意味著產生子外殼的解決方法?

是的。我在這裡找到了

從 Bash 4.4 開始,您可以使用@P擴展

而不是PS1='${BASH_PROMPT} '呼叫

PS1='${BASH_PROMPT@P} '

現在將進行與原始解碼$BASH_PROMPT一致的附加解碼。PS1

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