かなり大きなパイプラインを介してデータをストリーミングすることでデータを処理するスクリプトがあります。パイプラインのいくつかのセクションは、実際には、いくつかの外部パラメーターに基づいて異なることを行う「スイッチボード」機能です。考案された例を以下に示します。
#! /bin/bash
switchboard() {
# Select the appropriate command depending on input.
case "$1" in
1)
sort
;;
2)
awk '{ print $5 }' | sort
;;
*)
cat # <= Is there something more optimal here?
;;
esac
}
# The data processing pipeline.
<"$1" tr '[:upper:]' '[:lower:]' | switchboard "$2" | head -n 10
「配電盤」機能では、フォールバックはcat
を使用することだけです。 入力を出力に直接送信します。これは問題なく機能しますが、私のパイプラインには多くの「配電盤」がある可能性があり、何もしないcat
を大量に作成することは避けたいと思います。 可能であれば処理します。
パイプラインの特定のセクションがサブプロセスを使用せずにSTDOUTをSTDINに直接接続するように指定するために使用できるbash組み込み(または代替)のようなものはありますか? (:
を試しました しかし、それはデータを食べただけです)または、cat
これが問題にならないほど少量のリソースを使用しますか?
承認された回答:
まず、さらに別のcat
の使用 それほど大きな違いはないので、気にする必要はありません。
次に、パイプラインを構成するコマンドは、外部コマンドであるか組み込みコマンドであるかに関係なく、とにかく別々のプロセスで実行されます。
$ a=0
$ a=1 | a=2 | a=3
$ echo $a
0
正確な問題については、「stdin」を「stdout」に単純に接続することはできません。シェルにnop
があったとしても パイプラインで使用すると折りたたまれるビルトイン(例:| nop |
-> |
)、シェルは、パイプラインを設定するときに、「スイッチボード」がnop
に切り替わるかどうかを事前に知る方法がありません。 awk
の代わりに またはsort
。
パイプラインを自分で構築し、evalを呼び出して実行することで、「配電盤」と同じ効果を実現することもできます。例:
$ cat test.shtype =`file -zi" $ 1 "` case $ type in * application / gzip *)mycat ='zcat "$ 1"';; *)mycat ='cat "$ 1"';; esaccase $ type in * charset =utf-16le *)mycat ="$ mycat | iconv -f utf16le";; esac#blueesc =`printf'のコメントを強調表示
Linux