入力リダイレクトが一貫しないように動作します。

入力リダイレクトが一貫しないように動作します。

実験目的で名前付き10000010バイトファイル(99010行、それぞれ100行連続a)を作成しました。bigその後、テキスト全体をクリップボードにコピーしwcて実行しますstdin。次に、同じ効果を出す簡単なリダイレクトを作成しました。しかし、これが私が得るものです:

$ wc[Enter]
[paste 99010 lines of garbage copied directly from `big']
  99010   99010 10000010
$ wc < big
   99010    99010 10000010

さまざまなフィールド幅に注意してください。私の推測は、最初の結果が印刷され、"%7d %7d %7d"2番目の結果が印刷されることです"%8d %8d %8d"

誰かがこれがどのように可能であるかを説明できますか?私はwc2番目の実験に関する限り、入力も次から出てくるという印象を受けましたstdin(シェルが処理を処理するので、私が入力したという事実< bigさえwc知らないので、理論的にはwc次のことを行う必要があります)。同じことが2回ありますが、明らかにそうではありません。リダイレクトについて何を理解していませんか?

編集:これは重要ではないと思いますが、$ cat big | xclip -selection clipboardデータをクリップボードにコピーし、GNOME端末を右クリックして貼り付けました。誰もが自分のコンピュータでこれを試したい場合に備えてください。

答え1

GNU coreutils の wc 実装は列幅を最適化しようとします。通常のファイル(標準入力または名前で)を渡すと、各ファイルのすべてのディレクトリエントリを読み取って、ファイルサイズを特定して印刷するすべての数字が次の合計以下であることがわかります。ファイルサイズ。通常のファイルの場合、wcはそれに応じて列の幅を調整します。入力ファイルの1つ以上が通常のファイルではない場合、GNU wcはデフォルトの幅7を使用します。 (これは小さすぎるため、余分なスペースが増えたり、大きすぎて整列していない列が発生する可能性があります。)

関連情報