Bash

轉義字元“”如何在 bash 提示符下工作?

  • September 25, 2020

我最近開始調整我的 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 "\[...\]")'可能不會滿足您的要求。

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