我很困惑为什么 makefile 中的“| true”与“|| true”具有相同的效果

Kit*_*nde 13 shell pipe

我有一个生成文件,我在删除文件之前停止服务。当它无法停止服务时,它会因错误而中断。这显然是不需要的,所以我想我会添加|| true但错过了|. 进行中:

stop service foo | true
rm /etc/init/foo.conf
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*zek 16

true并且false是仅返回 0 和非 0 的coreutils(通常也是 shell 内置程序),适用于您碰巧需要该行为的情况。从手册页:

true - 什么都不做,成功
false - 什么都不做,不成功

因此,您将输出从stop service foointo管道传输true,它会忽略它并返回 0。从技术上讲,它可以工作,但您可能应该使用|| true它,因此很明显您的意图是什么;真的没有理由将输出通过管道传输到不使用它的程序中

  • 避免`|的另一个原因 true 是如果命令产生足够的输出来填满管道缓冲区,它将阻塞等待 `true` 读取它。 (9认同)
  • @Kit:注意`foo || true` 和 `foo | true` 不会做同样的事情:`foo || true` 将显示 `foo` 的输出,而 `foo | true` 将丢弃所有 `foo` 写入其标准输出的内容(并且 `foo` 可能会随着 `SIGPIPE` 或块而死亡,正如已经指出的那样)。 (6认同)
  • 很有道理。:) 我不知道为什么,但读 *“什么都不做,不成功。” * 让我发笑。 (5认同)
  • @cjm 或因 SIGPIPE 而死 (3认同)
  • 这个答案除了“可能”这个词之外,已经很完美了……! (2认同)