Bash
在 PS1 中未擴展 Bash 提示特殊字元
我正在嘗試
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)
時,PS1
會PS1
在.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