除了 awk/sed/perl/python 之外,是否有本地 Linux 命令可以打开或关闭管道输出?

除了 awk/sed/perl/python 之外,是否有本地 Linux 命令可以打开或关闭管道输出?

例如,假设我定义一个变量:

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

相关内容