cat a.txt | xargs -I % echo %
上記の例では、はコマンド引数としてxargs
受け取ります。ただし、場合によっては、引数を処理するために 1 つのコマンドではなく複数のコマンドが必要になります。例:echo %
cat a.txt | xargs -I % {command1; command2; ... }
しかし、xargs
この形式は受け入れられません。私が知っている解決策の 1 つは、コマンドをラップする関数を定義することですが、複雑なのでそれを避けたいと思います。もっと良い解決策はありますか?
ベストアンサー1
cat a.txt | xargs -d $'\n' sh -c 'for arg do command1 "$arg"; command2 "$arg"; ...; done' _
...または、猫の無駄使い:
<a.txt xargs -d $'\n' sh -c 'for arg do command1 "$arg"; command2 "$arg"; ...; done' _
いくつかの細かい点を説明します。
"$arg"
の代わりにを使用する(およびコマンド ラインで%
を使用しない) のは、セキュリティ上の理由によるものです。のコマンド ライン引数リストでデータを渡すのではなく、コードに代入すると、データに含まれる可能性があるコンテンツ (特に悪質な例として、 など) がコードとして実行されるのを防ぐことができます。-I
xargs
sh
$(rm -rf ~)
同様に、 の使用は
-d $'\n'
GNU 拡張機能であり、 がxargs
入力ファイルの各行を個別のデータ項目として扱うようになります。 または-0
(改行の代わりに NUL を期待する) のいずれかは、 xargs が読み取るストリームにシェルのような (ただしシェルと完全に互換性があるわけではないtr '\n' '\0' <a.txt | xargs -0 ...
) 解析を適用しようとするのを防ぐために必要です。 (GNU xargs がない場合は、を使用せずに行指向の読み取りを行うためにを使用できます-d
)。は
_
のプレースホルダであり$0
、 によって追加された他のデータ値は以降にxargs
なり$1
、これはループが反復処理するデフォルトの値セットになりますfor
。