エスケープされたパラメーターでコマンドを実行するには、sh -cを使用する必要があります。この文字列が見苦しく見えることはわかりますが、単純な文字列では問題は発生しません。
sh -cに渡されたときのエコー出力は単独で実行されるときとは異なり、これを解決する方法を探そうと努力しています。
背景:[1]これが渡されたときにechoコマンドの引数をエスケープし、追加のコマンドが挿入されていないことを確認したいと思います。 [2] sh -cは|やnohupなどのシェル機能を使いたいので使います。 [3] 関係がないかもしれませんが、これはリモートサーバーへのSSH接続を介して実行されます。
sh -c コマンドのコマンドと出力は次のとおりです。
sh -c "echo \a\\\\\b\;\c"
;c
スタンドアロンコマンドのコマンドと出力は次のとおりです。
echo \a\\\\\b\;\c
a\\b;c
どんな助けでも大変感謝します!
答え1
\
一部の文字(例えば\
、、、"
)$
をエスケープ`
し、二重引用符内の改行文字を削除するために使用されます。
sh -c "echo \a\\\\\b\;\c"
ように
sh -c 'echo \a\\\b\;\c'
sh は\
各文字をエスケープするために使用されるため、次のようになります。
echo 'a\b;c'
UNIX準拠のecho
sは\b
バックスペース文字(^H
)に展開されます。この文字は、端末に送信されたときにカーソルを1文字後ろに左に移動して上書きされるため、と表示さ;
れa
ます;c
。
echo
移植できないコマンドであり、その動作はシェルとシステムによって異なります。特に、与えられた引数にバックスラッシュが含まれている場合やダッシュで始まる場合は、これを避けるのが最善です。代わりにprintfを使用してください。
sh -c 'printf "%s\n" "a\\\\b;c"'
出力a\\b;c
。
(3つのバックスラッシュで十分ですが、二重引用符の中に2つのバックスラッシュが必要であることを覚えておくと安全です。)
エスケープシーケンスを拡張するなどの実装では、echo
バックスラッシュの数を2倍にする必要があります。
sh -c 'echo "a\\\\\\\\b;c"'
二重引用符を避けるには、シェルの唯一の特殊文字(二重引用符バージョンですでにエスケープされている文字;
に追加)のみをエスケープしてください。\
sh -c 'echo a\\\\\\\\b\;c'
一重引用符の代わりに二重引用符を使用するには、バックスラッシュの数を再び2倍にする必要があります。
sh -c "echo a\\\\\\\\\\\\\\\\b\\;c"
引用符を削除するには、スペースをエスケープして;
シェルをエスケープする必要があります。
sh -c echo\ a\\\\\\\\\\\\\\\\b\\\;c