同じファイルで複数のコマンドを1行で実行できるようにしたいと考えています。私が現在これを行う方法は:
commandA file && commandB file && Perl -ne '...' file
私の直感は、ファイル名引数を一度だけ提供し、それをxargs
または同様のものを介して両方のコマンドに同時にパイプする方法が必要であることを私に教えています:
find file | xargs commandA && xargs commandB && xargs Perl -ne '...'
これを試すと、最初のコマンドだけが実行されます。どうすればやりたいことを達成できますか?
このためのローカル変数を定義できます。
f=file; commandA $f && commandB $f && ...
すべてを無条件に実行することもできます(&&
と;
)または並列(&&
と&
)。
または、Shell履歴拡張を使用して、以前の引数を参照することもできます。
commandA file && commandB !:1 && ...
プロセスが置換されているBash、Korn、Zなどのシェルの場合、これを行うことができます。
find file | tee >(xargs commandA) >(xargs commandB) >(xargs Perl -ne '...')
Xargsを使用してコマンドラインを作成できます。例:
echo file | xargs -i -- echo ls -l {}\; wc -l {}
上記をbashにパイプして実行します。
echo file | xargs -i -- echo ls -l {}\; wc -l {} | bash
例を現在のディレクトリのすべての* .cファイルに拡張します(ここではlsをエスケープして、シェルエイリアスの置換を防止します)。
\ls -1 *.c | xargs -i -- echo ls -l {}\; wc -l {} | bash
私はこれに投票しません。これはばかげて危険ですが、これを行う方法をリストするためだけに、次のようなものがあります。
for cmd in "commandA" "commandB" "Perl -ne '...'" ; do eval $cmd file ; done