带有大括号扩展的 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'}
}
}
我有一个 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'}
}
}