次のようなコマンドを実行しようとすると:
ssh host_1 "cat test_file | sed 's/$/\tOK/'"
このエラーが発生しました:
変数名が不正です。
何が問題ですか?
ドル記号をエスケープしてみてください:
ssh host_1 "cat test_file | sed 's/\$/\\tOK/'"
走るとき
ssh host_1 "cat test_file | sed 's/$/\tOK/'"
ローカル シェルは、最初にその引数に対してパラメーター展開を実行します。コマンドはssh
、最初の引数はhost_1
、2 番目の引数は"cat test_file | sed 's/$/\tOK'"
です。2 番目の引数がダブル クォーテーションで囲まれているため、パラメーターの展開が試みられます。ただし、$/
は有効なパラメータではありませんbash
。一重引用符は、二重引用符で囲まれた文字列内の単なるリテラル文字であることに注意してください。パラメータ展開からドル記号を保護しません。したがって、他の質問で指摘されているように、ドル記号をエスケープする必要があります。
コマンドが実行されると、リモート エンドのシェルは次の文字列を受け取ります。
cat test_file | sed 's/$/\tOK'.
二重引用符は、ローカル シェルによる引用符の削除中に削除されるため、なくなりました。ドル記号も同様にエスケープされなくなりました。これで、リモート シェルは への最初の引数をsed
単一引用符で囲まれた文字列と見なすため、パラメーターの展開は実行されず、ドル記号をエスケープする必要もありません。
特殊文字をエスケープする必要があると思います:
ssh host_1 "cat test_file | sed 's/\$/\\tOK/'"
何が起こったのか、ようやくわかりました。
答えが私ではなくあなたのために働いている間、私は夢中になりました。あなたの答えは完全に正しいです。ただし、問題は、ksh ではなく csh を使用しているため、コマンド (パラメーター展開) の解釈がそれぞれ異なることです。
君たちありがとう。