以下代码适用于 Windows,但不适用于 Linux (Amazon Linux 2023):
const regex = "((fa[lrsdb]\\s+|(fa-(?:solid|regular|light|thin|duotone|brands|sharp|sharp-duotone)\\s+)+)(fa-fw\\s+)*)(fa-[0-9]x\\s+)*fa(-\\w+)+"
const grep = spawn(
'grep',
['-whorP', `'${regex}'`, './{classes,inc,public,tpl}'],
{ env: {...process.env, LC_ALL: 'en_US.utf8'} }
)
在 Linux 上我收到错误:
grep: /home/tdev/rentecbo/{classes,inc,public,tpl}: No such file or directory
如果我将
shell: true
添加到第三个参数,代码可以在 Linux 上运行,但在 Windows 上失败并出现错误:
\s+)+)(fa-fw\s+)*)(fa-[0-9]x\s+)*fa(-\w+)+' was unexpected at this time.
通过 CLI 手动运行命令适用于两种环境:
grep -whorP '((fa[lrsdb]\s+|(fa-(?:solid|regular|light|thin|duotone|brands|sharp|sharp-duotone)\s+)+)(fa-fw\s+)*)(fa-[0-9]x\s+)*fa(-\w+)+' ./{classes,inc,public,tpl}
我通过设置
shell: os.platform !== 'win32'
让脚本正常工作,但这有点 hacky。
./{classes,inc,public,tpl}
是一种 bash 语法,这就是为什么它在没有 shell=true 的 Linux 上无法工作的原因。如果这是真正的代码,最简单的方法是手动扩展它('./classes', './inc', './public', './tpl'
)
在 Windows 上 shell=true 表示 cmd.exe,默认情况下不是 bash,它会崩溃,因为您的正则表达式对于 cmd.exe 没有足够的转义
如果您坚持在 Windows 上使用 bash,请显式生成它,即
spawn('bash', ['-c', 'your command'] ...