「|」または、「&」を使用すると、サイズが異なる結果ファイルが提供されるのはなぜですか?

「|」または、「&」を使用すると、サイズが異なる結果ファイルが提供されるのはなぜですか?

私の説明は次のとおりです。

  1. strings *.bin > bin.txt | sort -n bin.txt > logs1.txt

    これは私に提供されますが、logs1.txt621KBです。

  2. strings *.bin > bin.txt & sort -n bin.txt > logs1.txt

    これは私に提供されますが、logs1.txt0KBがあります。

  3. strings *.bin > bin.txt
    sort -n bin.txt > logs2.txt

    これらのコマンドは586,853 KBのファイルを提供しますlogs2.txt

サイズはbin.txt586,853KBです。これは、3つのオプションのみを実行すると同じサイズが得られることを意味しますbin.txt。理由が何なのか気になります。

ベストアンサー1

この回答のいくつかの詳細はユーザーの使い方を想定していますzshzshシェルの詳細は、次の理由で若干異なります。そのMULTIOS特性

  1. strings *.bin > bin.txt | sort -n bin.txt > logs1.txt

    これにより実行され、strings *.bin結果がにリダイレクトされますbin.txt。同時にファイルが起動してソートさstringsれます。パイプラインには、両方のコマンドを同時に実行することを許可する以外に、このパイプライン内に機能はありません。sortbin.txt

    通常、パイプは左コマンドの標準出力を右コマンドの標準入力に転送するために使用されますが、どちらのコマンドもファイルから読み取られるため、パイプは使用されません。

    stringsとは同時に開始されるため、sortファイル全体が書き込まれる前にファイルの終わりが見つかる可能性がありますsort。読み取られるデータの量はかなりランダムです。bin.txtstringssort

    パイプの正しい使用は次のとおりです。

    strings -- *.bin | sort -n > logs1.txt
    

    ここでは、ファイルの代わりstringsに入力に直接書き込み、ファイルの代わりに出力から読み込みます。sortsortstrings

    パイプの左側が十分速くデータを生成できない場合、パイプの右側は一時的にブロックされます。パイプの右側が十分速くデータを消費できない場合、パイプの左側は一時的にブロックされます。このように、これら2つのユーティリティは同期sort、フル出力を読み取ることが保証されていますstrings

  2. strings *.bin > bin.txt & sort -n bin.txt > logs1.txt

    両方のコマンドが同時に開始さstringsれるため、前のコマンドと同じ問題があります。sortプログラムは&バックグラウンドで起動し、すぐに起動します。どちらのユーティリティも互いに独立して書き込みまたは読み込み、ファイルの最後に到達する前にファイルに書き込む分量を決定できます。stringssortbin.txtsort

  3. strings *.bin > bin.txtsort -n bin.txt > logs2.txt.

    stringsここでは、中間ファイルの内容がソートされる前に中間ファイルの書き込みが完了することを許可して、両方のユーティリティを手動で同期できます。問題ありません。ファイルから出力全体を読み取ることができることが保証されます。bin.txtsortsortstrings

一般化する:最初の2つのコマンドは同期されず、役に立ちませstringssort。 byを書いたことは、を読むこととはstrings何の関係もありませんsort。これはsort、すべてのデータが書き込まれる前に中間ファイルの終わりを見つけることができることを意味します。stringsこれは、最終的に不完全な最終結果で終わることができることを意味します。不完全な結果に含まれるデータの量は、機会によって異なります。

両方のユーティリティが同時に起動されるという事実は、シェルがファイルを切り取り始める前にsort既存のファイルをbin.txt最後まで読み取ることができることを意味しますstrings

解決策: 3 番目の例のように、まずすべてのデータを中間ファイルに書き込み、次に中間ファイルから読み込みます。あるいは、上記のように、両方のユーティリティがパイプを使用して2つのユーティリティ間で直接データを通信できるようにします。

strings -- *.bin | sort -n > logs1.txt

stringsまたは、後で参照できるようにソートされていない出力のコピーを保管してください。

strings -- *.bin | tee bin.txt | sort -n > logs1.txt

U&Lに関するより関連性の高い資料:

おすすめ記事