スクリプトを書いている間、いくつかの奇妙なことが見つかりました。
次の例は期待どおりに機能します。
$ echo 123 | awk '{print $1 456}'
123456
$ sh -c "echo 123 | awk '{print $1}'"
123
ただし、次の例ではそうではありません。
$ sh -c "echo 123 | awk '{print $1 456}'"
456
最初の列には、追加された文字列が印刷されると予想されます。この文字列は、123456
.txtなしで同じコマンドを実行したときと同じように返す必要がありますsh -c
。しかし、何らかの理由で最初の列は無視されています。興味深いことに、$1
文字列接続を行わなくても印刷に問題はありません。
これが発生するのはなぜですか。別のシェルインスタンスに渡されたコマンドで文字列接続をどのように実行しますか?
答え1
$
フラグをエスケープする必要があります。
$ sh -c "echo 123 | awk '{print \$1 456}'"
123456
それ以外の場合は、$1
現在のシェルに展開します。