Shell

在符合 POSIX 的主流 shell 中轉義雙引號內的特殊字元的行為是否與 POSIX 不一致?

  • January 17, 2019

根據POSIX Shell 命令語言頁面

\

僅當被認為是特殊<backslash>的以下字元之一時,才應保留其作為轉義字元的特殊含義(請參閱轉義字元(反斜杠)):

$ ``` " \ <newline>

我將此解釋為意味著\如果這五個特殊字元中的一個在其給定上下文中是特殊的,則應該只轉義它。

ash、dash、bash 和 ksh 的手冊頁不包含“當被視為特殊時”的子句。我認為這意味著(並已通過基本實驗證實)\具有無條件轉義這五個字元的效果,即使這五個字元之一在其給定上下文中並不特殊。

考慮 的輸出$ printf '%s\n' "\abcde",即\abcde。這是意料之中的,因為a在這種情況下(或與此相關的任何情況下)並不特殊;因此 the\並不特殊,而是按字面意思對待。

現在考慮 的輸出$ printf '%s\n' "\\abcde",即\abcde。這不是我所期望的行為。在我看來,字元串中的第一個反斜杠\\abcde也應該按字面意思對待,因為在不特殊\的上下文中後面跟著它。\我期望的輸出是\\abcde.

我看到意外行為的另一種情況是在 的輸出中$ printf '%s\n' "ab\$",即ab$. 在我看來,$在這種情況下確實具有特殊含義,因為它確實用於引入參數擴展、命令替換或算術擴展。因此,在我看來,\應該按字面意思對待,因為它在不特殊$的上下文中緊隨其後。$我期望的輸出是ab\$.

為了記錄,我希望我完全不在這兒。這讓我的生活變得更加困難,不得不擔心只有在某些情況下才能逃脫這五個角色。\我努力盡可能地正確,如果主流 POSIX 兼容 shell 中的這種(個人希望的)行為不符合 POSIX ,我不想依賴於無條件地轉義這五個特殊字元。

本註釋建議在考慮特殊時刪除文本。

注:0000998 中有一組建議的更正

該說明還報告說,該變更已於 2012 年 8 月 30 日獲得批准。

我無法說明為什麼現在的措辭中仍然使用它。

我相信你可以忘記那些話。

echo "\abc\$\\"(例如)涉及兩個步驟。

首先,由於字元串參數echo是雙引號,shell 將對其中的轉義字元進行處理。

在它的情況下,"\abc\$\\"它會在將其轉換為\abc$\之前將其交給echo. 將\a保持不變,因為a它不是“特殊”字元之一。其他轉義字元將是literal,這意味著它們在 shell 中不再具有特殊含義($不開始擴展,反斜杠不轉義下一個字元等)請注意,$雙精度末尾的 a帶引號的字元串仍然是“特殊的”,因為它可能引入了擴展,如果字元串沒有在它之後結束。這兩個字元串"a$""a\$"是相同的,因為$第一個字元串中的 沒有應用於任何東西。

然後,echo可以對該字元串參數進行自己的解釋。例如,某些實現echo會認為\a是“鈴鐺字元”的意思。

我也認為你在這裡誤讀了標準。反斜杠後跟特殊字元之一的評估將刪除反斜杠。您似乎認為它應該保持不變並且 eg\$應該保留為\$. 標准說的恰恰相反

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