例如,假设我定义一个变量:
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 语言有点生疏,所以它可能不符合最新的编码标准,但是当 HUPped 时,这会切换输出关闭和打开。
答案2
我发现我无法使用任何解决方法,而必须定义一个函数:
spigot(){
if [ -z "$1" ]; then
cat
fi
}
...
while ...
... | spigot $DROP
done