web-dev-qa-db-ja.com

単一の行で複数のコマンドに引数を渡す

同じファイルで複数のコマンドを1行で実行できるようにしたいと考えています。私が現在これを行う方法は:

commandA file && commandB file && Perl -ne '...' file

私の直感は、ファイル名引数を一度だけ提供し、それをxargsまたは同様のものを介して両方のコマンドに同時にパイプする方法が必要であることを私に教えています:

find file | xargs commandA && xargs commandB && xargs Perl -ne '...'

これを試すと、最初のコマンドだけが実行されます。どうすればやりたいことを達成できますか?

10
Zaid

このためのローカル変数を定義できます。

f=file; commandA $f && commandB $f && ...

すべてを無条件に実行することもできます(&&;)または並列(&&&)。

または、Shell履歴拡張を使用して、以前の引数を参照することもできます。

commandA file && commandB !:1 && ...
12
maxschlepzig

プロセスが置換されている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
2
frielp

私はこれに投票しません。これはばかげて危険ですが、これを行う方法をリストするためだけに、次のようなものがあります。

for cmd in "commandA" "commandB" "Perl -ne '...'" ; do eval $cmd file ; done

1
frabjous