Bash
轉義字元“”如何在 bash 提示符下工作?
我最近開始調整我的 bash 提示符,我發現自己不理解轉義字元是如何工作的。我有以下內容:
PS1="\[$RED\]\342\224\214\342\224\200"
在這我明白了,
\[
轉義[
字元並\xxx
轉義我的 UTF-8 字元。但在以下行中,我得到了一個奇怪的結果:
PS1+="$([·\$?·!=·0·]·&&·echo·\[$RED\]\342\234\227\·)"
這將始終
X
在我的提示符中列印,但如果我轉義第一個$
,它只會在任何命令的退出狀態不為零時列印它。我不懂為什麼。不$(commands)
應該輸出給定的結果commands
嗎?如果我像這樣轉義它\$()
是整個序列轉義還是只是美元符號?如果我不逃避,為什麼不列印$
?它只是列印X
. 我$
對方括號裡面有同樣的問題。為什麼我要逃避它?另外我相信這符合另一個問題,但有沒有辦法在我的提示中列印實際的退出狀態?
在雙引號字元串中,會處理命令替換 (
$(...)
) 和變數擴展 ($foo
),並且美元符號前面的反斜杠會阻止這種情況,從而刪除反斜杠。這發生在分配期間PS1="$(...)"
或PS1="\$(...)"
。但是在列印提示時也會處理相同的擴展,因此如果在賦值時對美元符號進行了轉義,則結果
PS1
將具有未轉義的美元符號,並且在列印提示時會發生擴展。因此,使用未轉義的命令替換,該命令僅在分配提示時執行一次。使用反斜杠,它會在每次列印提示時執行。
這兩者的區別應該很容易測試:
PS1="$(date) " PS1="\$(date) "
\[
不過順序不同。它僅在處理提示時才相關,而不是在正常的雙引號字元串中。它用於標記不列印任何可見字元的提示部分。此外,它僅在擴展之前的提示中有效,因此類似的東西PS1='$(echo "\[...\]")'
可能不會滿足您的要求。