我需要从非BASH脚本(即PHP脚本)执行许多管道外壳命令,如下所示:
command1 | command2 | command3
因此,如果command1
退出代码非零而失败,则其他命令也会失败。到目前为止,我想出的是:
set -o pipefail && command1 | command2 | command3
但是,即使它在终端上运行正常,但是如果通过脚本执行,它也会产生此结果:
sh:1:设置:非法选项-o pipefail
@JonathanLeffler我运行
—
Desmond Hume
/bin/sh set -o pipefail
时说/bin/sh: 0: Can't open set
(与相同sudo
)。希望我测试正确。该系统是Ubuntu12。–
你需要尝试
—
乔纳森·勒夫勒
/bin/sh -c "set -o pipefail"
; 实际上,shell试图在当前目录中执行一个名为的脚本set
,但找不到该脚本。
@JonathanLeffler
—
Desmond Hume
/bin/sh -c "set -o pipefail"
无法正常工作,但是bash -c "set -o pipefail"
可以正常工作。
因此,您的问题是脚本
—
乔纳森·勒夫勒
/bin/sh
无法识别运行set -o pipefail
。因此,您需要确保脚本运行的是/bin/bash
而不是/bin/sh
。或者,如果您有信心,则勇敢地(可能很笨拙)将其更改/bin/sh
为链接或副本,/bin/bash
而不是当前链接到的任何shell或副本。如果确定/bin/sh
是这样bash
,那么您使用的行为bash
在以as身份运行时不会暴露/bin/sh
; 使用bash
的bash
。
/bin/sh
不喜欢set -o pipefail
。它实际上bash
是伪装的,还是其他外壳?何时bash
运行/bin/sh
,是否接受set -o pipefail
?