33

私はこれについてかなり混乱しています。いくつかの説明が必要です。

例 1 :

pgrep string | xargs ps

例 2 :

find . | xargs grep whatever

例 1 から、次のようになります。

実行中のプロセスの名前の一部である「文字列」を検索し、すべての一致のプロセス ID を 'xargs ps' に返します -> ps を一致 (プロセス ID 自体) に追加して同じものを取得します次のように出力します。

ps <processid>

この場合、誰かが xargs が実際に何をするのか説明できますか?

例 2 から、次のようになります。

現在の作業ディレクトリから再帰的に「文字列」を検索することです。ここで、「xargs」はどのように機能しますか?

私は、「xargs」は標準入力からのデータを xargs (通常はそれ自体が UNIX コマンド) に与えられた「引数」に繰り返し追加するという意見でした。

xargs() のマニュアルページから:

xargs は、空白 (二重引用符、単一引用符、またはバックスラッシュで保護できます) または改行で区切られた標準入力から項目を読み取り、コマンド (デフォルトは /bin/echo) を 1 回以上実行し、その後に任意の初期引数が続きます。標準入力から読み込まれた項目によって。標準入力の空白行は無視されます。

4

5 に答える 5

56

一般的にxargsはこのように使用されます

prog | xargs utility

whereprogは、改行/スペースで区切られた 1 つ以上の結果を出力することが期待されます。トリックは、結果ごとに 1 回xargs呼び出す必要はなく、結果をサブリストに分割し、すべてのサブリストを呼び出すことです。単一の結果ごとに xargs を強制的に呼び出したい場合は、 で呼び出す必要があります。 utilityutilityutilityxargs -L1

に送信されるサブリストがより短いことをxargs約束することに注意してください(興味がある場合は、usingの現在の値を取得できます) 。utilityARG_MAXARG_MAXgetconf ARG_MAX

于 2009-12-14T19:12:06.127 に答える
14

xargs が行うことの良い例は、find を使用してディレクトリ内のすべてのファイルのソートされたチェックサムを取得しようとすることです。

find . | cksum  | sort

チェックサムを 1 つだけ返しますが、それが何のチェックサムなのかは明確ではありません。私たちが望むものではありません。パイプは、標準出力を find から cksum の標準入力に送信します。cksum が本当に必要としているのは、コマンド ライン引数のリストです。

cksum file001.blah file002.blah  file003.blah

は、ファイルごとに 1 行ずつ、目的のチェックサムを含む 3 行を報告します。Xargs は、前のプログラムの stdout を一時的な非表示のコマンド ラインに変換して、次のプログラムにフィードする魔法のトリックを実行します。機能するコマンドラインは次のとおりです。

find . | xargs cksum | sort

xargs と cksum の間にパイプがないことに注意してください。

于 2009-12-13T22:46:39.390 に答える
8
$ echo 'line1
> line2
> line3
> ...
> lineN ' | xargs cmd1 -a -b

結果は次のとおりです。

$ cmd1 -a -b line1 line2 line3 ... lineN

xargs行数が大きくなりすぎると、 のcmd1 ...複数の実行に分割されます。cmd1

xargsstdin行を位置引数として渡すことに関連する他の多くのタスクに使用できます。コマンドの複数のインスタンスを並行して実行するためのxargs(1)の capital-Pオプションを見てください。

于 2009-12-13T22:41:26.267 に答える
4
#!/bin/sh
#script to echo out the arguments 1 at a time!
for a in $*
do
    echo $a
done

コマンド

$sh myscript 1 2 3 4 5

譲ります

1
2
3
4
5

しかし

$sh myscript 1 2 3 4 5 6 7 8 9 10 11

パラメーターの最大数を超えているため、機能しません (最大数が実際にはわかりませんが、この例では 10 としましょう!)

これを回避するには、

#!/bin/sh
#script to echo out the arguments 1 at a time!
for a in $*
do
    echo $a | xargs echo
done

次に、このように実行できます

 $sh myscript "1 2 3 4 5" "6 7 8 9 10 11"

パラメータが2つしかないため、正しい結果が得られます

于 2009-12-13T22:43:21.493 に答える
2

xargs は通常、引数をグループ化するために使用されるため、コマンドに多数の引数を渡すときに発生する「引数が多すぎます」というエラーが発生しません。

于 2009-12-13T22:35:26.947 に答える