我有一个makefile,在删除文件之前要在其中停止服务。如果无法停止该服务,则会在出错时中断。这显然是不需要的,所以我想我会添加|| true
但错过了|
。进行中:
stop service foo | true
rm /etc/init/foo.conf
我对为什么这起作用以及正在发生的事情感到困惑。这是否意味着它true
是一个应用程序,而不仅仅是关键字?他们是一样的吗?有充分的理由使用| true
吗?
我有一个makefile,在删除文件之前要在其中停止服务。如果无法停止该服务,则会在出错时中断。这显然是不需要的,所以我想我会添加|| true
但错过了|
。进行中:
stop service foo | true
rm /etc/init/foo.conf
我对为什么这起作用以及正在发生的事情感到困惑。这是否意味着它true
是一个应用程序,而不仅仅是关键字?他们是一样的吗?有充分的理由使用| true
吗?
Answers:
true
并且false
是coreutils(通常也是shell内置程序),在您碰巧需要该行为的情况下,它们仅返回0和非0。从手册页:
正确-不执行任何操作,成功完成
否-不执行任何操作不成功
因此,您正在将输出从管道输送stop service foo
到true
,它将忽略它并返回0。从技术上讲,它是可行的,但是您应该使用|| true
它,因此很明显您的意图是什么;确实没有理由将输出通过管道传递给不使用它的程序
| true
是,如果命令产生的输出足以填充管道缓冲区,它将阻塞等待true
读取的时间。
foo || true
并且foo | true
不会做相同的事情:foo || true
将显示来自的输出foo
,而foo | true
将丢弃所有foo
写入其标准输出的内容(并且foo
可能已经死亡SIGPIPE
或阻塞,如前所述)。