通过Node.js运行bash脚本-非法选项-o pipefail

3
我将通过Node.js使用child_process.exec()执行bash脚本。但是它在文件的第二行崩溃了:
#!/usr/bin/env bash
set -eo pipefail; [[ $TRACE ]] && set -x

echo "we are here"

返回的错误信息是:
/bin/sh: 2: set: Illegal option -o pipefail

为什么会出现这种情况?当我手动运行脚本时,而不是从Node运行时,它可以正常工作。以下是Node.js代码:

var child = child_proc.exec(bashScript, {
    env: _.extend(process.env, {
        'LB_HOST': config.loadBalancers.lb1
    }),
    timeout: 0
});

child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);

根据 https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback ,默认情况下 shell 是 /bin/sh,这可能是原因吗? - Benjamin W.
1个回答

4
默认情况下,当你调用 child_process.exec() 时,它使用的是 /bin/sh,在Ubuntu上实际上是一个指向 /bin/dash 的符号链接。Dash 是精简版的bash,我猜不支持以下功能:
set -eo pipefail; [[ $TRACE ]] && set -x

shell选项添加到Node.js的child_proc.exec()可以解决此问题:

shell: '/bin/bash'

3
有趣,但为什么 #!/usr/bin/env bash 被忽略了? - SaintHax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接