xargs で複数のコマンドを実行する 質問する

xargs で複数のコマンドを実行する 質問する
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"の代わりにを使用する(およびコマンド ラインで%を使用しない) のは、セキュリティ上の理由によるものです。のコマンド ライン引数リストでデータを渡すのではなく、コードに代入すると、データに含まれる可能性があるコンテンツ (特に悪質な例として、 など) がコードとして実行されるのを防ぐことができます。-Ixargssh$(rm -rf ~)

  • 同様に、 の使用は-d $'\n'GNU 拡張機能であり、 がxargs入力ファイルの各行を個別のデータ項目として扱うようになります。 または-0(改行の代わりに NUL を期待する) のいずれかは、 xargs が読み取るストリームにシェルのような (ただしシェルと完全に互換性があるわけではないtr '\n' '\0' <a.txt | xargs -0 ...) 解析を適用しようとするのを防ぐために必要です。 (GNU xargs がない場合は、を使用せずに行指向の読み取りを行うためにを使用できます-d)。

  • _のプレースホルダであり$0、 によって追加された他のデータ値は以降にxargsなり$1、これはループが反復処理するデフォルトの値セットになりますfor

おすすめ記事