&引用;grep THIS foo.txt>;这个.txt“;当grep输出为空时,在Makefile而不是bash中给出错误

&引用;grep THIS foo.txt>;这个.txt“;当grep输出为空时,在Makefile而不是bash中给出错误,makefile,grep,Makefile,Grep,Makefile如下所示: THIS.txt : foo.txt grep THIS foo.txt > $@ 当grep输出为空时(foo.txt中没有),make会给出一条错误消息,bash不会: $ make make:*** [THIS.txt] Error 1 $ grep THIS foo.txt > THIS.txt $ grep THIS foo.txt 2>&1 为什么?当grep输出为空时,如何修改makefi

Makefile如下所示:

THIS.txt : foo.txt  
        grep THIS foo.txt > $@
当grep输出为空时(foo.txt中没有),make会给出一条错误消息,bash不会:

$ make  
make:*** [THIS.txt] Error 1

$ grep THIS foo.txt > THIS.txt  

$ grep THIS foo.txt 2>&1  

为什么?当
grep
输出为空时,如何修改makefile以避免出现错误消息?

grep
在bash中不会给出错误,但它会返回非零退出代码:

> grep THIS foo.txt 2>&1
> echo $?
1
如果您想清除非零退出代码,以便
make
不会将其标记为错误,您可以执行以下操作:

THIS.txt : foo.txt
     grep THIS foo.txt > $@ || true

|true
位表示“如果存在非零退出代码,则返回
true
的退出代码(在bash中总是
0
).

谢谢!有没有一种简单的方法来区分由于空输出而产生的非零退出代码和由于其他原因产生的非零退出代码?这样就可以系统地强制为“否”。空输出并不自动意味着非零退出代码。它只是特定于
grep
的操作方式-如果没有找到任何匹配项,它将以n退出关于零退出代码。@user584744:您应该接受这个答案,这是Unix可执行文件工作的基础。很抱歉延迟标记为已接受!只是还不熟悉这个过程。感谢您的回答,它非常适合解决我的问题,我相应地修改了生成文件…+1我需要在使用
bash-e的cron-ed脚本中使用它显然,当我使用
bash-e
运行脚本时,脚本会自动失败,而grep找不到任何东西。