多くのコマンドラインユーティリティは、パイプまたはファイル名引数から入力を受け取ることができます。長いシェルスクリプトの場合、チェーンを起動すると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
。これらのパイプラインは本当に理解しやすく、個々のコンポーネントはその機能で簡単にデバッグできます。