我有一个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或阻塞,如前所述)。