望ましくない猫に興味を持たなければなりませんか?

望ましくない猫に興味を持たなければなりませんか?

多くのコマンドラインユーティリティは、パイプまたはファイル名引数から入力を受け取ることができます。長いシェルスクリプトの場合、チェーンを起動するとcat読みやすくなります。特に、最初のコマンドに複数行の引数が必要な場合はさらにそうです。

比較する

sed s/bla/blaha/ data \
| grep blah \
| grep -n babla

そして

cat data \
| sed s/bla/blaha/ \
| grep blah \
| grep -n babla

後者のアプローチはそれほど効率的ではありませんか?それでは、スクリプトを実行するかどうか(たとえば、1秒に1回)を気にするほど違いはありますか?読みやすさの違いは大きくありません。

ベストアンサー1

もちろん、「最終」の答えは次のとおりです。cat賞の無駄な使用

catの目的は、ファイルをリンク(または「接続」)することです。単純なファイルの場合、他のものとリンクするのは時間の無駄であり、プロセスのコストがかかります。

コードを読みやすくするためにcatをインスタンス化すると、プロセスと不要な入力/出力ストリームセットのみが追加されます。多くの場合、スクリプトの実際の障害は、非効率的な屋根ふきと実際の処理です。ほとんどの最新システムでは、追加の方法はパフォーマンスcatに影響を与えませんが、ほとんど常にコードを書く他の方法があります。

すでに知っているように、ほとんどのプログラムは入力ファイルの引数を受け入れることができます。ただし、STDINストリームが必要なときはいつでも、すでに<実行されているシェルプロセスでタスクを実行してプロセスを保存する組み込みシェルを使用することは常に可能です。

書く場所に応じて創造性を発揮することもできます。通常、次のように出力リダイレクトまたはパイプが指定される前にコマンドの最後に配置されます。

sed s/blah/blaha/ < data | pipe

しかし、必ずしもそうではありません。最初に来ることもできます。たとえば、サンプルコードは次のように書くことができます。

< data \
    sed s/bla/blaha/ |
    grep blah |
    grep -n babla

スクリプトの読みやすさを重視し、コードが複雑すぎて行を追加すると、理解しcatやすくなると思われる場合は、コードを整理する別の方法があります。私がよく使う1つの方法は、パイプラインを論理セットに分割して関数に格納することです。これにより、後でスクリプトを理解しやすくなります。これにより、スクリプトコードが非常に自然になり、パイプラインのすべての部分をデバッグするのが簡単になります。

function fix_blahs () {
    sed s/bla/blaha/ |
    grep blah |
    grep -n babla
}

fix_blahs < data

その後、続行できますfix_blahs < data | fix_frogs | reorder | format_for_sql。これらのパイプラインは本当に理解しやすく、個々のコンポーネントはその機能で簡単にデバッグできます。

おすすめ記事