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


10

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

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

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

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

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

回答:


12

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

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

また、すべて無条件(交換実行することができ&&;)、または並行して(置き換え&&&)。

または、シェル履歴の展開を使用して、以前の引数を参照することもできます。

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

私が考えていたものとはまったく異なりますが、興味深い代替手段です。
Zaid 2010

この答えの何が問題になっていますか?
Chris

かっこいい!新しい変数を定義しない方法はありますか?
ユーザ

@ユーザー、私は代替を追加しました。
maxschlepzig 2016


2

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

:この名前は、「列挙型」のようなものであるディレクトリに含まれるファイルのすべてのリストを取得するために使用 find . -name "*enums*" | xargs -i echo -e echo {}\; ls -lh {}\; echo -e '\n\n' | bash
マット・ラックマン

1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.