Shell

sh -c 的外殼轉義字元

  • November 24, 2017

我需要使用 sh -c 執行帶有轉義參數的命令。我知道字元串看起來很醜,但簡單的不會造成問題。

傳遞給 sh -c 時的迴聲輸出與單獨執行時不同,我正在努力弄清楚如何修復它。

背景:

$$ 1 $$我正在轉義 echo 命令的參數,因為這是傳入的,我想確保沒有插入額外的命令。 $$ 2 $$我正在使用 sh -c 因為我希望能夠使用 shell 工具,例如 | 或 nohup 等。 $$ 3 $$可能不相關,但這是通過與遠端伺服器的 ssh 連接執行的。 sh -c 命令的命令和輸出是:

sh -c "echo \a\\\\\b\;\c"

;c

獨立命令的命令和輸出是:

echo \a\\\\\b\;\c

a\\b;c

任何幫助將非常感激!

\用於轉義一些字元(如\自身"、、、、$)```並刪除雙引號內的換行符,所以

sh -c "echo \a\\\\\b\;\c"

就好像

sh -c 'echo \a\\\b\;\c'

對於那個 sh,\用於轉義每個字元,所以它變成了

echo 'a\b;c'

符合 UNIX 標準echo的 s 擴展\b為退格字元 ( ^H),當發送到終端時,會將游標向左移動一個字元,因此;覆蓋a,這就是您看到 的原因;c

echo是一個不可移植的命令,其行為因 shell 和系統而異。最好避免使用,特別是如果給定的參數可能包含反斜杠或可能以破折號開頭。請改用 printf。

sh -c 'printf "%s\n" "a\\\\b;c"'

輸出a\\b;c

(3 個反斜杠就足夠了,但更安全的是記住在雙引號內,你需要兩個反斜杠才能得到一個)。

對於echo像您這樣擴展轉義序列的實現,您必須將反斜杠的數量加倍。

sh -c 'echo "a\\\\\\\\b;c"'

如果您想避免使用雙引號,您只需轉義;作為 shell 唯一特殊字元的字元(除此之外\,您已經在雙引號版本中轉義了該字元)。

sh -c 'echo a\\\\\\\\b\;c'

如果您想使用雙引號而不是單引號,那麼您必須再次將反斜杠的數量加倍。

sh -c "echo a\\\\\\\\\\\\\\\\b\\;c"

而且,如果您想擺脫引號,則需要轉義空格並;再次轉義外殼。

sh -c echo\ a\\\\\\\\\\\\\\\\b\\\;c

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