我对为什么“ |感到困惑 生成文件中的“ true”与“ ||”具有相同的作用。真正”


13

我有一个makefile,在删除文件之前要在其中停止服务。如果无法停止该服务,则会在出错时中断。这显然是不需要的,所以我想我会添加|| true但错过了|。进行中:

stop service foo | true
rm /etc/init/foo.conf

我对为什么这起作用以及正在发生的事情感到困惑。这是否意味着它true是一个应用程序,而不仅仅是关键字?他们是一样的吗?有充分的理由使用| true吗?

Answers:


16

true并且falsecoreutils(通常也是shell内置程序),在您碰巧需要该行为的情况下,它们仅返回0和非0。从手册页:

正确-不执行任何操作,成功完成
否-不执行任何操作不成功

因此,您正在将输出从管道输送stop service footrue,它将忽略它并返回0。从技术上讲,它是可行的,但是您应该使用|| true它,因此很明显您的意图是什么;确实没有理由将输出通过管道传递给不使用它的程序


4
很有道理。:)我不知道为什么,但是读“不做任何事,不成功”。使我发笑。
Kit Sunde

9
避免的另一个原因| true是,如果命令产生的输出足以填充管道缓冲区,它将阻塞等待true读取的时间。
cjm 2011年

3
@cjm或死于SIGPIPE
Andy

6
@Kit:请注意,foo || true并且foo | true不会做相同的事情:foo || true将显示来自的输出foo,而foo | true将丢弃所有foo写入其标准输出的内容(并且foo可能已经死亡SIGPIPE或阻塞,如前所述)。
吉尔斯(Gilles)'所以

除了“可能”一词外,这个答案是完美的!
山姆·沃特金斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.