2017-05-04 27 views
0

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. 

看来,纱线使用sh执行这些脚本,但我想用bash关于这个问题,可以使用大括号展开。

回答

1

它可以使用system函数启动命令,也可参见man 3 system

要查看哪个系统呼叫时:

strace yarn ... 

system使用fork + exec + wait和EXEC家庭功能使用壳/bin/sh

到用bash命令可以改为bash -c 'command ..'

+0

'的bash -c '命令..''按预期工作,非常感谢。但是,有没有设置默认shell的方法,所以在将来不会发生? –

+1

我认为不是如果它是通过纱线系统调用完成的,它是特定于实现的,并且由于'man 3 exec'' man 3 system'指定了'/ bin/sh' –

1

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

但是,由于yarn使用Node生成其进程,因此可以通过更改Node自身使用的默认shell来解决此问题。

在Ubuntu上,如果你有root权限,你可以通过改变符号链接/bin/sh这样做是为了指向其他的东西比dash

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

在Windows的Git-bash中,你可以改变COMSPEC环境变量为C:\Windows\system32\cmd.exe以外的东西,但我没有得到那个为我工作。

参见: