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