1

私はこれらのファイルをディレクトリに持っています:y y1 y2 y3

このコマンドの実行:
ls y* | xargs -i basename {}|xargs -i sed "s/{}//g"

これを生成します:
1
2
3

誰かが理由を説明できますか?!私はそれが何も生成しないことを期待していました-sedを4回実行し、ファイルごとに1回実行し、毎回ファイル名を削除します。しかし実際には、y1 y2y3のリストの最初のファイルに{}を設定してsedを適用しているように見えます

これはSolaris10です

4

2 に答える 2

2

xargs -i sed...コマンドへの入力は次のとおりです。

y
y1
y2
y3

コマンドは行を読み取り、標準入力から読み取るyを実行します。sed s/y//g標準入力は継承されるため、標準入力と同じパイプを持ち、残りの入力を読み取ることができる場合があります。

y1
y2
y3

このコマンドは、各行からsed s/y//gを削除します。y

1
2
3

ただし、最初のコマンドが実行されるxargs前にすべての入力を消費した場合、コマンドには読み取る入力が残っておらず、何も実行されません。sedsed

于 2009-08-26T16:08:02.677 に答える
2

Linuxボックスでこれを試してみると、一貫性のない結果が得られます。時々123、時々(ほとんどの場合)23、時々12。これは、右端xargssedそれがスポーンするものとの間の微妙なバッファリングの競合状態です。

コマンドラインの分析:

  • ls y*y、y1、y2、y3の4行を出力します。バッファリングは関係ありません
  • xargs -i basename {}basename yそれらを読み取り、順番に起動しますbasename y1、、、、; 出力は、この場合の入力と同じように、各行が異なるプロセスからのものであるため、行バッファリングされます。basename y2basename y3
  • xargs -i sed "s/{}//g"、X行ごとに(後で詳しく説明します)、起動しますsed "s/X//g"
  • それぞれsed "s/X//g"が、読み取った行に表示される各Xを除外します

トリッキーになるところ:最後の2つのコマンドは、同じストリームからの入力を読み取ります。そのストリームは、シーケンス内の複数の異なるプロセスによって生成されます。多数の要因(システム負荷、スケジューリング)に応じて、出力は非常に異なるタイミングパターンで出力される可能性があります。

それらがすべて非常に高速であると仮定しましょう。xargsそうすれば、4行すべてが単一のブロックで読み取る権利に利用できる可能性があります。その場合、どのsedsも読み取るための入力が残っていないため、出力はまったくありません。

一方、非常に遅い場合はxargs、最初の読み取り試行で右側に使用できる行が1行しかない可能性があります。その行は「y」になります。 xargs最初のをとして生成しますsedsed "s/y//g"これにより、残りのすべての入力(y1、y2、y3)、ストリップy、および出力1、2、3が消費されます。これも同じ説明ですが、より明確な順序付けがあります。

  1. 最初basenameに「y」を書き込みます。
  2. xargsは「y」を読み取り、スポーンしsed s/y//gます。xargs完了するのを待ちますsed
  3. 2番目basenameは「y1」を書き込みます。sed「y1」を読み取り、「1」を書き込みます
  4. 3番目basenameは「y2」を書き込みます。 sed「y2」を読み取り、「2」を書き込みます
  5. 4番目basenameは「y3」を書き込みます。sed「y3」を読み取り、「3」を書き込みます
  6. xargsが完了しました。sedEOFを読み取り、停止します
  7. xargsは続行を試み、EOFを読み取り、停止します

私の12のケースについてはよくわかりません。おそらく、GNUxargsは、子が完了するのを待たずに、後続の使用可能な入力を読み取り、最初のから「y3」行を取得しsedます。

いずれの場合も、同じライター上に複数の同時リーダーを使用してパイプラインを設定するだけで、ほとんどの場合、不確定な結果が得られます。 避けるべきです。

各ファイルに対する操作が必要な場合は、使用するファイル名を指定することで回避できますsed(最後の{}に注意してください)。

ls y* | xargs -i basename {} | xargs -i sed "s/{}//g" {}

クロス積タイプの結果(各ファイルから各ファイル名を削除)が必要な場合は、ファイルの数だけファイルリストを作成するように調整する必要があります。プラス1つ、xargsまだ使用している場合。

お役に立てれば。

于 2009-08-26T16:10:02.173 に答える