调试自己写的一个 cli 程序时,发现从命令行读取的参数有问题,最后发现是一个 Git Bash 的一个 feature 导致的
当输入的参数含有/
开头的内容时,该参数会被特殊处理,如果是/+单字母
会被转换为盘符,否则会拼接到 Git 的目录后面
另外使用key=value
这种风格时,value 的值也会经过特殊处理,但是 key 中出现了一些别的符号时又正常了
解决
-
方案 1
编辑 Git Bash 的配置文件,比如
E:\Program Files\Git\etc\bash.bashrc
。在最末尾添加MSYS_NO_PATHCONV
的配置但是当你使用
npm
的时候会发现 npm 不能用了,所以对于前端开发这么改不太合适alias ll='ls -lh --color' export LANG="zh_CN.UTF-8" export LC_ALL="zh_CN.UTF-8" export MSYS_NO_PATHCONV=1
-
方案 2
运行程序时指定,缺点就是太麻烦了,而且 cmd 里面不支持这种写法
MSYS_NO_PATHCONV=1 ./main.exe /a
-
方案 3
转义参数,不同 terminal 之间不兼容
./main.exe //a
-
方案 4
程序处理,自定定义一套风格去解析,比如
app k1:v1 k2:v2
这种兼容性比较好,但是不太符合主流风格
参考
git bash cannot find module npm-cli.js
How to stop MinGW and MSYS from mangling path names given at the command line