grep via child_process.spawn 适用于 Windows 的 Git Bash 或 Linux 上的真正 bash - 但不能同时适用于两者

问题描述 投票:0回答:1

以下代码适用于 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。

node.js bash grep git-bash
1个回答
0
投票

./{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'] ...

© www.soinside.com 2019 - 2024. All rights reserved.