从shell管道返回true
问题描述:
我想根据另一个命令的返回值在gnu makefile中有条件地执行命令。从shell管道返回true
具体而言,是这样的:
lsmod | grep -q pfc && sudo rmmod pfc
如果lsmod
模块,输出的当前列表中包含pfc
,将其删除。这可以起到一个小问题,即如果grep
命令失败(模块不存在),则整个管道返回非零值,这会导致该命令被解释为失败,但事实上这是成功的。
我可以在最后添加一个; true
以始终强制它成功,但这不会在rmmod
命令中发现故障!
我想要的东西大多是sh
实现,但技术上我想我使用的是dash
,因为这是在Ubuntu的sh
点。
答
你可以只通过一个NOP指令清理退出值一样echo -n
处理预期的故障:
if lsmod | grep -q pfc; then sudo rmmod pfc; else echo -n; fi
应的输出是缺少NOP指令被执行,整条生产线与$?=0
返回。
编辑:
被认为会像她那样的简单的NOP的:
if lsmod | grep -q pfc; then sudo rmmod pfc; else true; fi
RESP
if lsmod | grep -q pfc; then sudo rmmod pfc; else :; fi
由于这条管道_unconditionally_返回true。特别是如果'rmmod'失败,我们想返回false,但是上面的返回值是true。 – BeeOnRope
这只是一个问题,如果你正在使用'set -e',这是一个坏主意,恰恰是因为它假设所有非零退出状态表示一个错误。 – chepner
@chepner - 我没有使用'set -e',但调用应用程序('gmake')将非零返回视为错误,这是有道理的。 – BeeOnRope