3

Rampion のコードxargs manでの の使用を理解したい:

screen -t man /bin/sh -c 'xargs man || read'

Rampion のおかげで、猫は必要ありません!

なぜxargsコマンドで必要なのですか?

-の部分は次のように理解してxargsいます

  1. xargsに何も猫
  2. xargs は man コマンドのリストを作成します

xargs がコマンドのリストを作成するという考えがありました。例えば、

find . -type f -print0 | xargs -0 grep masi 

コマンドのリストと同じです:

find fileA AND grep masi in it 
find fileB AND grep masi in it 
           and so on for fileC, fileD, ...
4

3 に答える 3

4

いいえ、何もしませcatん。コマンドを実行した後に得られる入力は何でも cat します。 catここでは実際には無関係なので、無視しましょう。

xargs manユーザー入力を待ちます。これは必要です。あなたがそれをつかんだスクリプトでは、ウィンドウを作成するまで man の引数を貼り付けることはできません。そのため、ウィンドウで実行されるコマンドは、man を実行しようとする前に、私が何かを与えるのを待つ必要があります。

を実行しただけではscreen /bin/sh -d 'man || read'、常に「どのマニュアル ページが必要ですか?」というメッセージが表示されます。私たちはそれを決して言わなかったので。

于 2009-07-13T20:18:16.743 に答える
3

このcatコマンドは何も操作しません。入力が終了したことが通知されるまで、標準入力で動作します。Rampion が指摘しているように、catここではコマンドは必要ありませんが、コマンドは暗黙の入力 (標準入力) に対して動作しており、何もに対して動作していません。

このxargsコマンドは から出力を読み取り、情報を(唯一の) 引数として指定されcatたコマンドへの引数にグループ化します。man制限 (コマンド ラインで構成可能) に達すると、manコマンドが実行されます。

このfind ... -print0 | xargs -0 ...イディオムは、空白、タブ、改行などの扱いにくい文字を含むファイル名を扱います。このfindコマンドは、各ファイル名の後に ASCII NUL ( '\0') を付けて出力します。これは、単純なファイル名に使用できない 2 つの文字のうちの 1 つです。もう 1 つは '/' です (もちろん、パス名には使用されますが、単純なファイル名には使用されません)。あなたが提供するシーケンスと直接同等ではありません。xargsサイズ制限まで、ファイル名のコレクションを単一の引数リストにグループ化します。grep名前が十分に短い場合 (通常はそうです)、ファイル名よりも実行回数が少なくなります。

grepまた、検索するファイルが複数ある場合、または常にファイル名を出力し、オプションが使用されるようにオプションをサポートしている場合にのみ、マテリアルが見つかったファイル名のみを出力することに注意してください-H。それに対するGNU拡張grepがこれを行います。ファイル名が常に表示されるようにするための移植可能な方法は/dev/null、最初のファイルとしてリストすることです (つまり ' xargs grep something /dev/null')。検索にそれほど時間はかかりません/dev/null

于 2009-07-13T20:39:34.920 に答える
3

xargs は stdin から引数を収集し、それらの引数で指定されたコマンドを実行します。

そのため、cat は何かが入力されるのを待っており、xargs はその入力で man を実行しています。

xargs は、処理するファイルがたくさんある場合に便利です。私は、find からの出力でよく使用します。xargs は、コマンド ラインにできるだけ多くの引数を詰め込みます。
次のようなことをするのに最適です

find . -name '*.o' -print | xargs rm
于 2009-07-13T20:31:11.490 に答える