我需要从非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?