1行で複数のコマンドにパラメータを渡す

1行で複数のコマンドにパラメータを渡す

同じファイルから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

関連情報