たとえば、変数を定義するとします。
DROP=
ループがあります。
# highly compatible, streaming,
# line-wise parser for embedded device
# no awk or external dependency
while IFS= read -r line; do
...
generate_output_1 | xargs echo
...
generate_output_2 | xargs echo
...
generate_output_N | xargs echo
done <<<$(cleanFile x.txt) > "$OUTPUT_STREAM"
出力転送機能をどのように切り替えますか?関数定義を考えることができますが、出力をオフまたはオンにするコマンドはありますか?
# e.g.
DROP=-d
generate_output | spigot ${DROP}
これらのコメントを解決するために、質問をする前にifステートメントを使用しました。ストリーミングパーサーに精通している人は、可能であればif文を避けることが重要です。なぜなら、whileループの本文にすでにif文が必要な場合が多いからです。したがって、私は制御式(例えば[ .. ] && ... || ...
)を含むif文の解決を避けるために多くの努力をします。
第二に、変数を定義しようとしていますPIPE
。
if [ -z "$DROP" ]; then
PIPE=/dev/stdout
else
PIPE=/dev/null
fi
代わりに追加し... | xargs echo
てください。実際、私のBASHバージョンと仮想化環境のwhileループでは機能しません。これは、私がwhileループの出力を管理するためにこの手法を使用したからです。この手法は、例の最後の行ですでに使用されています。では、OUTPUT_STREAM
パラメータまたはデフォルト値に基づいてファイルを交換します/dev/stdout
。
done <<<$(cleanFile x.txt) > "$OUTPUT_STREAM"
私が本当に望むのは、タスクを実行するための簡潔なコマンドですspigot
。それはすべてです。
ベストアンサー1
いいえ、ありません。あなたの要件をよく理解すれば、そのようなコマンドを作成するのは簡単です。たとえば、
#include <stdio.h>
#include<signal.h>
#include<unistd.h>
int flag;
void sig_handler(int signum){
if (flag==1){flag=0;}
else { flag=1;}
}
void main (){
int c;
flag=1;
signal(SIGHUP,sig_handler);
while ((c=getchar())!=EOF){
if (flag==1) {
putchar (c);
}
}
}
私のCは少し錆びて、最新のコーディング標準に合わないかもしれませんが、HUPが実行されると出力がオフになり、点灯します。