指定 shell Yarn 用于 运行 脚本

Specify which shell Yarn uses for running scripts

我的 package.json 中有这样一个脚本:

"buildTslint": "node_modules/typescript/bin/tsc node_modules/awesomeLibrary_node_tslint/{,helpers/}*.ts",

注意 {,helpers/}*.ts 部分,这称为 Brace Expansion 并且仅在 bash 中可用,而不是 sh

当 运行 yarn buildTslint 我得到以下输出:

# yarn buildTslint
yarn buildTslint v0.22.0
$ node_modules/typescript/bin/tsc node_modules/awesomeLibrary_node_tslint/{,helpers/}*.ts
error TS6053: File 'node_modules/awesomeLibrary_node_tslint/{,helpers/}*.ts' not found.
error Command failed with exit code 2.

Yarn 似乎使用 sh 来执行这些脚本,但我想为此使用 bash,以便能够使用大括号扩展。

它可以使用 system 函数启动命令,另请参阅 man 3 system

查看使用了哪个系统调用:

strace yarn ...

system 使用 fork+exec+wait 并且 exec 系列函数使用 shell /bin/sh

要使用bash命令可以改成bash -c 'command ..'

Yarn 尚未提供配置用于 运行 脚本的默认 shell 的方法,请参阅:https://github.com/yarnpkg/yarn/issues/4248

但是,由于 yarn 使用 Node 来生成其进程,您可以通过更改 Node 本身使用的默认值 shell 来解决这个问题。

在 Ubuntu 上,如果您有 root 权限,您可以通过将符号链接 /bin/sh 更改为指向 dash 以外的其他内容来执行此操作:

sudo ln -sf /bin/bash /bin/sh

在Git-bash中Windows,你可以把COMSPEC环境变量改成C:\Windows\system32\cmd.exe以外的东西,但是我没有让它为我工作。

另请参阅:

  • Force node to use git bash on windows

新配置参数 script-shell 的纱线版本 1.19 added support。您现在可以执行以下操作:

yarn config set script-shell /bin/bash