在我的节点模块中,我创建了一个使用npm i -g
全局安装的工具。此工具是一个bash脚本,用于设置本地配置,调用其他一些脚本,还需要设置一些环境变量。
在Linux上,它可以正常调用
$ . my-setup
或
$ source my-setup
这将调用my-setup
,并且由于使用“dot”或source调用,脚本设置的环境变量将导出到调用shell。没问题。
但是,在Windows 7中的Git bash上运行相同的脚本时,会调用该脚本,但之后将关闭整个shell。 在研究NPM如何处理Windows中全局安装的二进制文件时,我注意到了
$ type my-setup
my-setup is /c/Users/jhh/AppData/Roaming/npm/my-setup
反过来扩展到
"$basedir/node_modules/<my-module>/my-setup.sh" "$@"
exit $?
所以,我怀疑这里的最终退出声明是什么导致在Windows上获取此脚本时关闭调用shell。如果我手动
$ . "$basedir/node_modules/<my-module>/my-setup.sh"
然后脚本执行正常并且变量导出正确,而不关闭shell。
这里发生了什么? NPM的包装器调用脚本并调用exit $?
的意图是什么?为什么在使用source
调用时只会导致问题?我应该如何创建一个安装了npm的工具,该工具可以在Windows(Git Bash)和Linux上使用source
或.
进行调用,将环境变量导出到调用shell并且不关闭它?