シェルが「catの役に立たない使用」を自動的に変更しないのはなぜですか? [閉鎖]

シェルが「catの役に立たない使用」を自動的に変更しないのはなぜですか? [閉鎖]

多くの人が以下を含む限り、1行のスクリプトとスクリプトを使用します。

cat "$MYFILE" | command1 | command2 > "$OUTPUT"

最初catは技術的に新しいプロセス(通常/usr/bin/cat)を開始する必要があるため、「catの役に立たない使用」と呼ばれることがよくあります。これは、コマンドがすでに実行されている場合は回避できます。

< "$MYFILE" command1 | command2 > "$OUTPUT"

その理由は、シェルを起動して与えられたファイルをcommand1指すだけです。stdin

シェルがこの変換を自動的に実行しないのはなぜですか?「無駄な猫を使う」構文が読みやすく、役に立たない猫を自動的に削除するのに十分な情報がシェルにあるべきだと思います。これはcatPOSIX標準で定義されているため、パスにバイナリを使用する代わりに、シェルが内部でそれを実装できるようにする必要があります。シェルには実装の引数バージョンが含まれており、パスのバイナリに置き換えることもできます。

ベストアンサー1

「無駄な使用cat」は、スクリプトが実行されたときに実際に実行されるよりもコードがどのように書かれるかに関するものです。これはデザインです。アンチパターン、より効率的な方法で作業を実行できる方法です。新しいツールを作るために与えられたツールを組み合わせる最善の方法を理解していませんでした。パイプラインで複数のコマンドsedやコマンドを一緒にまとめることは、awk時には同じアンチパターンの症状と言うことができると思います。

スクリプトの「無駄な使用」状況を修正するには、cat主にスクリプトのソースコードを手動で変更する必要があります。次のツール住宅検査次の明白なケースを指摘すると、この問題を解決するのに役立ちます。

$ cat script.sh
#!/bin/sh
cat file | cat
$ shellcheck script.sh

In script.sh line 2:
cat file | cat
    ^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.

シェルスクリプトの性質により、シェルにこの操作を自動的に実行させるのは難しい場合があります。スクリプトの実行方法は、親プロセスから継承された環境と利用可能な外部コマンドの特定の実装によって異なります。

シェルはcatそれが何であるかを必ず知る必要はありません。そうかもしれないどの$PATHあるいは、関数のどこからでもコマンドを発行できます。

組み込みコマンドの場合(一部のシェルにある可能性があります)会議cat組み込みコマンドの意味を知っているので、パイプラインを再設定できます。その前に、パイプライン内の元のコマンド以降の次のコマンドについても想定する必要がありますcat

標準入力からの読み出しは、ファイルへの接続時とパイプへの接続時に若干異なる動作をします。パイプは検索できないため、パイプラインの次のコマンドが実行する操作に応じて、パイプを並べ替えると動作が異なる場合があります。そうでない場合は、とにかく動作が異なります)。

この質問は似ています(非常に一般的な意味では)」コンパイラはそれ自体で構文エラーを修正しようとしますか?「(ソフトウェアエンジニアリングStackExchangeサイトで)この質問は、明らかに構文エラーに関するものであり、役に立たないデザインパターンに関するものではありません。

おすすめ記事