時々、次のような内容が表示されます。
cat file | wc | cat > file2
なぜこのようなことをするのですか?
結果(またはパフォーマンス)が次の簡単な場合といつ(有利に)変わるのでしょうか。
cat file | wc > file2
答え1
どちらの例も猫に役に立たない用途。どちらも同じです。動的に出力を生成するための一時的な代替手段として使用しない限り、この例では使用するwc < file1 > file2
理由はありません。cat
cat 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
(最後の瞬間に殺されるかもしれません)。cat
file2
- たぶん、誰かがコンテンツを開いたり読んだりする失敗(終了状態)を隠したいと思うかもしれません
file
。しかし、それはより意味があるでしょうwc < file > file2 || :
。 - たぶん誰かが(List Open Files)の出力から単語
lsof
数を取得したり。file
file2
答え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モデムバージョンでモデムシェルを使用しているわけではありません。 (特定のオペレーティングシステムの標準としていくつかの共通コマンドが提供されていない場合でも、パイプライン内のコマンドがインストールされているすべてのシステムで機能するようにパイプラインを作成することは有益です。)