在管道中使用“ifne”——运行多个命令

在管道中使用“ifne”——运行多个命令

在我的脚本中,我使用的ifnemoreutils包裹。该行可以简化为以下内容:

printf "asdf\n" | ifne cat - && echo "stream not empty"

ifne仅当流非空时才执行。但是如何才能使第二个命令 ( echo "stream not empty") 仅在流非空时才执行?例如,如何更改以下命令,使其不打印“流不为空”?

printf "" | ifne cat - && echo "stream not empty"

包围catecho带括号会产生语法错误:

printf "" | ifne (cat - && echo "stream not empty")

如何仅在流非空时执行最后一个命令?

答案1

使用这种格式:

printf ""     | ifne sh -c  "cat - ; echo 'stream not empty' "

输出为无,并且:

printf "bb\n" | ifne sh -c  "cat - ; echo 'stream not empty' "

输出是:

bb
stream not empty

答案2

ifne不会根据输入是否为空来设置退出代码,因此&&||不会按预期工作。 Babyy 的答案的另一种方法是使用pee同一个包:

printf "asdf\n" | pee 'ifne cat -' 'ifne echo "stream not empty"'

其工作方式类似于tee,但将输入流复制到多个管道中,将每个参数视为要运行的命令。 (tpipe是一个类似的命令,但行为略有不同。)

但一个可能的问题是,每个命令可能会并行写入标准输出,具体取决于输入/输出的缓冲和长度,输出有可能会交错,或者每次运行都会有所不同(实际上是一场竞赛)。这可能可以使用sponge(相同的包)代替cat, 和/或来消除其他缓冲/非缓冲解决方案。它会影响您给出的示例,但可能不会影响您的实际用例。

相关内容