Linuxボックスでこれを試してみると、一貫性のない結果が得られます。時々123、時々(ほとんどの場合)23、時々12。これは、右端xargs
とsed
それがスポーンするものとの間の微妙なバッファリングの競合状態です。
コマンドラインの分析:
ls y*
y、y1、y2、y3の4行を出力します。バッファリングは関係ありません
xargs -i basename {}
basename y
それらを読み取り、順番に起動しますbasename y1
、、、、; 出力は、この場合の入力と同じように、各行が異なるプロセスからのものであるため、行バッファリングされます。basename y2
basename y3
xargs -i sed "s/{}//g"
、X行ごとに(後で詳しく説明します)、起動しますsed "s/X//g"
- それぞれ
sed "s/X//g"
が、読み取った行に表示される各Xを除外します
トリッキーになるところ:最後の2つのコマンドは、同じストリームからの入力を読み取ります。そのストリームは、シーケンス内の複数の異なるプロセスによって生成されます。多数の要因(システム負荷、スケジューリング)に応じて、出力は非常に異なるタイミングパターンで出力される可能性があります。
それらがすべて非常に高速であると仮定しましょう。xargs
そうすれば、4行すべてが単一のブロックで読み取る権利に利用できる可能性があります。その場合、どのsed
sも読み取るための入力が残っていないため、出力はまったくありません。
一方、非常に遅い場合は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
が完了しました。sed
EOFを読み取り、停止します
- 右
xargs
は続行を試み、EOFを読み取り、停止します
私の12のケースについてはよくわかりません。おそらく、GNUxargs
は、子が完了するのを待たずに、後続の使用可能な入力を読み取り、最初のから「y3」行を取得しsed
ます。
いずれの場合も、同じライター上に複数の同時リーダーを使用してパイプラインを設定するだけで、ほとんどの場合、不確定な結果が得られます。 避けるべきです。
各ファイルに対する操作が必要な場合は、使用するファイル名を指定することで回避できますsed
(最後の{}に注意してください)。
ls y* | xargs -i basename {} | xargs -i sed "s/{}//g" {}
クロス積タイプの結果(各ファイルから各ファイル名を削除)が必要な場合は、ファイルの数だけファイルリストを作成するように調整する必要があります。プラス1つ、xargs
まだ使用している場合。
お役に立てれば。