在我的脚本中,我使用的ifne
是moreutils
包裹。该行可以简化为以下内容:
printf "asdf\n" | ifne cat - && echo "stream not empty"
ifne
仅当流非空时才执行。但是如何才能使第二个命令 ( echo "stream not empty"
) 仅在流非空时才执行?例如,如何更改以下命令,使其不打印“流不为空”?
printf "" | ifne cat - && echo "stream not empty"
包围cat
并echo
带括号会产生语法错误:
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
, 和/或来消除其他缓冲/非缓冲解决方案。它会影响您给出的示例,但可能不会影响您的实际用例。