从shell管道返回true

问题描述:

我想根据另一个命令的返回值在gnu makefile中有条件地执行命令。从shell管道返回true

具体而言,是这样的:

lsmod | grep -q pfc && sudo rmmod pfc 

如果lsmod模块,输出的当前列表中包含pfc,将其删除。这可以起到一个小问题,即如果grep命令失败(模块不存在),则整个管道返回非零值,这会导致该命令被解释为失败,但事实上这是成功的。

我可以在最后添加一个; true以始终强制它成功,但这不会在rmmod命令中发现故障!

我想要的东西大多是sh实现,但技术上我想我使用的是dash,因为这是在Ubuntu的sh点。

+0

由于这条管道_unconditionally_返回true。特别是如果'rmmod'失败,我们想返回false,但是上面的返回值是true。 – BeeOnRope

+0

这只是一个问题,如果你正在使用'set -e',这是一个坏主意,恰恰是因为它假设所有非零退出状态表示一个错误。 – chepner

+0

@chepner - 我没有使用'set -e',但调用应用程序('gmake')将非零返回视为错误,这是有道理的。 – BeeOnRope

你可以只通过一个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 
+3

有一些比较简单的数字,比如'true'或':'。 – nobody

+1

[对于符合标准的外壳,你根本不需要任何nop](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_07) –

+0

@ dave_thompson_085 bash不接受一个空的else分支 – yacc