猫のパイピングがリダイレクトにのみ使用されるのはなぜですか? [コピー]

猫のパイピングがリダイレクトにのみ使用されるのはなぜですか? [コピー]

時々、次のような内容が表示されます。

cat file | wc | cat > file2

なぜこのようなことをするのですか?

結果(またはパフォーマンス)が次の簡単な場合といつ(有利に)変わるのでしょうか。

cat file | wc > file2

答え1

どちらの例も猫に役に立たない用途。どちらも同じです。動的に出力を生成するための一時的な代替手段として使用しない限り、この例では使用するwc < file1 > file2理由はありません。catcat file

答え2

cat file | wc | cat > file2

cat一般的には、以下の機能的に同じであるため、2つの役に立ちません。

< file wc > file2

ただし、次のような状況がある可能性があります。

cat file | wc -c

超過

< file wc -c

wcこれは、多くの実装が通常のファイルに対して実行する最適化を無効にすることです。

通常のファイルでは、ファイルのバイト数を取得するためにファイルの内容全体を読み取る必要はありませんが、stat()システムコールを実行してinodeに格納されているサイズを取得するだけです。

これで、次の理由でこのファイルを読みたい場合があります。

  • 情報stat()を信頼できません(例:Linux上の特定のファイル/proc/sys

    $ < /sys/class/net/lo/mtu wc -c
    4096
    $ cat /sys/class/net/lo/mtu | wc -c
    6
    
  • 人々は読み取ることができるデータの量を確認したいと思います(たとえば、ハードドライブの障害など)。
  • 人々は単にデータの読み出し速度のベンチマークを望んでいます。
  • ファイルの内容をメモリにキャッシュしたいです。

もちろんこれは例外です。通常、< file wc -cパフォーマンス上の理由からそれを使用することをお勧めします。


cat file | wc | cat > file2これで :: を使用したいと思うもう少しとんでもないシナリオを想像できます。

  • 許可されているwc場合は、ファイルを読み書きできないようにする衣類プロファイルやその他のセキュリティメカニズムがある可能性があります。cat
  • 大きなファイル(たとえば、2 32バイト以上)catを処理できますが、このシステムでは処理できません(過去のシステムの一部のコマンドには同様のものが必要でした)。wc
  • たぶん誰かが書き込みのために開くことができなくても、ファイル全体を実行して読みたいと思うかもしれませんwc(最後の瞬間に殺されるかもしれません)。catfile2
  • たぶん、誰かがコンテンツを開いたり読んだりする失敗(終了状態)を隠したいと思うかもしれませんfile。しかし、それはより意味があるでしょうwc < file > file2 || :
  • たぶん誰かが(List Open Files)の出力から単語lsof数を取得したり。filefile2

答え3

「猫を役に立たない」という主張に同意しませんが、できる理由は次のとおりです。

英語を含む多くの言語では、単語や文章が左から右に読み込まれるため、同じ方法でデータフローを表示することが読者にとってより自然に見えます。

2番目の理由catは戻りコードを隠すことです。たとえば、

$ wc < /etc/passw
sh: /etc/passw: Cannot find or open the file.
$ echo $?
1

そしてcat

$ wc < /etc/passw | cat
sh: /etc/passw: Cannot find or open the file.
$ echo $?
0

知覚が固まるとこれが作用しますset -e。最初の例ではシェルが中断されますがwc、後者の例では実行され続けます。この問題を解決する他の方法も明らかにあります。

さらに、2つのステートメント(つまり、catの有無にかかわらず)間のパフォーマンスの違いは無視できます(特に今日のコンピュータでは)、重要な場合はシェルは無効な言語です。

答え4

このステートメントには、catの2つの用途が含まれています。

書類トイレ|>ファイル2

明らかに、2番目の猫は価値がありません。

ファイル|トイレ > ファイル2

私が使用したすべてのシェルで同じ意味を持ちます。

しかし、

<ファイルwc>ファイル2

該当しないみんなシェル。

誰もがUNIXモデムバージョンでモデムシェルを使用しているわけではありません。 (特定のオペレーティングシステムの標準としていくつかの共通コマンドが提供されていない場合でも、パイプライン内のコマンドがインストールされているすべてのシステムで機能するようにパイプラインを作成することは有益です。)

関連情報