带有大括号扩展的 NodeJS Exec cp 给出了不同的结果。为什么?

NodeJS Exec cp with brace expansion gives different results. Why?

我有一个 g运行t-shell 命令,它使用大括号展开 cp 图像文件。

file: Gruntfile.js
cpImgTmp: {
    command: 'cp ./app/images/{*.png,*.jpg,*.ico} tmp/images' 
}

当我在 Mac运行 上 运行 这个 g运行t-shell 命令时 OS,它做了预期的事情但是 returns 'cannot cp...' ubuntu 上的错误。

我搜索了 g运行t-shell 库,发现它使用了 exec 函数。 我在受控环境中再次测试了命令

exec('cp ./app/images/{*.png,*.jpg,*.ico} tmp/images')

和已验证的 exec 函数的 spawn args 相同:

['/bin/sh', '-c', 'cp ./app/images/{*.png,*.jpg,*.ico} tmp/images']

我在 ubuntu 服务器终端内成功执行了命令。 所以我的 问题 是 nodejs 在不同环境中处理大括号扩展的问题,我可以将哪些选项传递给 nodejs 以使该命令跨 unix OS?

我认为这不是 nodejs 问题,而是 unix shell 问题,nodejs 可以避免。

问题是 sh 不支持大括号扩展,bash 支持。 在我的 Mac 上,sh 是指向 bash 和 ubuntu (18.04) sh 的符号链接是 dash 的符号链接(从结果来看,这显然不支持大括号扩展)。

解决方案是通过 {shell: '/bin/bash'} 使大括号扩展在 unix 系统中工作,而不是默认的 '/bin/sh' shell.

使用 NodeJS exec 函数的示例:`exec('cp ./app/images/{.png,.jpg,*.ico} tmp/images', {shell: '/bin/bash'})

示例使用 grunt-shell

cpImgTmp: {
    command: 'cp ./app/images/{*.png,*.jpg,*.ico} tmp/images',
    options: {
        execOptions: {shell: '/bin/bash'}
    }
}