私の説明は次のとおりです。
strings *.bin > bin.txt | sort -n bin.txt > logs1.txt
これは私に提供されますが、
logs1.txt
621KBです。strings *.bin > bin.txt & sort -n bin.txt > logs1.txt
これは私に提供されますが、
logs1.txt
0KBがあります。strings *.bin > bin.txt
sort -n bin.txt > logs2.txt
これらのコマンドは586,853 KBのファイルを提供します
logs2.txt
。
サイズはbin.txt
586,853KBです。これは、3つのオプションのみを実行すると同じサイズが得られることを意味しますbin.txt
。理由が何なのか気になります。
ベストアンサー1
この回答のいくつかの詳細はユーザーの使い方を想定していますzsh
。zsh
シェルの詳細は、次の理由で若干異なります。そのMULTIOS
特性。
strings *.bin > bin.txt | sort -n bin.txt > logs1.txt
これにより実行され、
strings *.bin
結果がにリダイレクトされますbin.txt
。同時にファイルが起動してソートさstrings
れます。パイプラインには、両方のコマンドを同時に実行することを許可する以外に、このパイプライン内に機能はありません。sort
bin.txt
通常、パイプは左コマンドの標準出力を右コマンドの標準入力に転送するために使用されますが、どちらのコマンドもファイルから読み取られるため、パイプは使用されません。
strings
とは同時に開始されるため、sort
ファイル全体が書き込まれる前にファイルの終わりが見つかる可能性がありますsort
。読み取られるデータの量はかなりランダムです。bin.txt
strings
sort
パイプの正しい使用は次のとおりです。
strings -- *.bin | sort -n > logs1.txt
ここでは、ファイルの代わり
strings
に入力に直接書き込み、ファイルの代わりに出力から読み込みます。sort
sort
strings
パイプの左側が十分速くデータを生成できない場合、パイプの右側は一時的にブロックされます。パイプの右側が十分速くデータを消費できない場合、パイプの左側は一時的にブロックされます。このように、これら2つのユーティリティは同期
sort
、フル出力を読み取ることが保証されていますstrings
。strings *.bin > bin.txt & sort -n bin.txt > logs1.txt
両方のコマンドが同時に開始さ
strings
れるため、前のコマンドと同じ問題があります。sort
プログラムは&
バックグラウンドで起動し、すぐに起動します。どちらのユーティリティも互いに独立して書き込みまたは読み込み、ファイルの最後に到達する前にファイルに書き込む分量を決定できます。strings
sort
bin.txt
sort
strings *.bin > bin.txt
sort -n bin.txt > logs2.txt
.strings
ここでは、中間ファイルの内容がソートされる前に中間ファイルの書き込みが完了することを許可して、両方のユーティリティを手動で同期できます。問題ありません。ファイルから出力全体を読み取ることができることが保証されます。bin.txt
sort
sort
strings
一般化する:最初の2つのコマンドは同期されず、役に立ちませstrings
んsort
。 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に関するより関連性の高い資料: