Shell
sh -c 的外殼轉義字元
我需要使用 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