Linuxボックスでこれを試してみると、一貫性のない結果が得られます。時々123、時々(ほとんどの場合)23、時々12。これは、右端xargsとsedそれがスポーンするものとの間の微妙なバッファリングの競合状態です。
コマンドラインの分析:
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最初のをとして生成しますsed。sed "s/y//g"これにより、残りのすべての入力(y1、y2、y3)、ストリップy、および出力1、2、3が消費されます。これも同じ説明ですが、より明確な順序付けがあります。
- 最初
basenameに「y」を書き込みます。
- 右
xargsは「y」を読み取り、スポーンしsed s/y//gます。xargs完了するのを待ちますsed。
- 2番目
basenameは「y1」を書き込みます。sed「y1」を読み取り、「1」を書き込みます
- 3番目
basenameは「y2」を書き込みます。 sed「y2」を読み取り、「2」を書き込みます
- 4番目
basenameは「y3」を書き込みます。sed「y3」を読み取り、「3」を書き込みます
- 左
xargsが完了しました。sedEOFを読み取り、停止します
- 右
xargsは続行を試み、EOFを読み取り、停止します
私の12のケースについてはよくわかりません。おそらく、GNUxargsは、子が完了するのを待たずに、後続の使用可能な入力を読み取り、最初のから「y3」行を取得しsedます。
いずれの場合も、同じライター上に複数の同時リーダーを使用してパイプラインを設定するだけで、ほとんどの場合、不確定な結果が得られます。 避けるべきです。
各ファイルに対する操作が必要な場合は、使用するファイル名を指定することで回避できますsed(最後の{}に注意してください)。
ls y* | xargs -i basename {} | xargs -i sed "s/{}//g" {}
クロス積タイプの結果(各ファイルから各ファイル名を削除)が必要な場合は、ファイルの数だけファイルリストを作成するように調整する必要があります。プラス1つ、xargsまだ使用している場合。
お役に立てれば。