0

我有一个 grunt-shell 命令,它使用大括号扩展 cp 图像文件。

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

当我在 MacOS 上运行这个 grunt-shell 命令时,它会执行预期的操作,但会在 ubuntu 上返回“cannot cp ...”错误。

我搜索了 grunt-shell lib,发现它使用了 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 操作系统工作?

4

1 回答 1

0

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

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

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

使用 NodeJSexec函数的示例:`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'}
    }
}
于 2018-12-09T06:17:47.517 回答