在shell脚本中,我经常使用多个管道,如下所示:
cmd1 | cmd2 | cmd3
现在,如果cmd2
丢失,管道将导致“断开”,并且cmd3
不会收到任何输入。
作为解决方法,我可以明确测试cmd2是否存在,但这需要一些我想避免的代码复制。
相反,我想要一个更简洁的测试,例如:
cmd1 | cmd2; [ $? -eq 127 ] && cat | cmd3
根据您的示例,您似乎正在寻找一种将参数分组到优先级低于的操作|
(即&&
和||
)的方法。
在{
和}
元字符可用于这种分类方式。
上面的示例可以这样写(使用的退出状态which
确定是否cmd2
存在)。
cmd1 | { which cmd2 >/dev/null && cmd2 || cat; } | cmd3
例如
printf "hi\n" | { : && rev || cat; } | cat
会列印 ih
您关于使用子外壳程序的建议也可以,但是不必要地使用另一个进程
printf "hi\n" | ( : && rev || cat ) | cat
我要说的是,如果if
在管道外部使用显式的方法,那么它可能不会那么棘手,而对于可维护性则更好。
if [ which cmd2 >/dev/null ]
then
cmd1 | cmd3
else
cmd1 | cmd2 | cmd3
fi
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句