WSL Bash如何正确传递含空格/换行参数给Win10主机程序
解决方案
核心原理
你遇到的问题本质是WSL跨系统调用的参数适配问题:WSL调用Windows可执行程序时,会将Bash传入的参数列表拼接为单条Windows风格的命令行字符串,再交给目标程序解析。原生的$@不加引号会把带空格的参数拆分为多个独立参数,加"包裹的"$@"又不符合Windows程序的命令行解析规则,才会出现参数带多余引号、无法识别的问题。
最终实现脚本
完全基于Bash内置语法实现,无任何额外依赖,所有WSL发行版默认支持:
#!/usr/bin/env bash # 配置git.exe路径,若已将Git加入Windows系统PATH,可直接写GIT_BIN="git.exe" GIT_BIN="/c/Program Files/Git/cmd/git.exe" # 逐参数做Windows命令行兼容转义 trans_args=() for raw_arg in "$@"; do # 转义参数内自带的双引号 escaped_arg=${raw_arg//\"/\\\"} # 包含空格/换行/制表符的参数外层包裹双引号 if [[ $escaped_arg =~ [[:space:]] ]]; then escaped_arg="\"$escaped_arg\"" fi trans_args+=("$escaped_arg") done # 替换当前进程为git.exe,传递转义后的参数 exec "$GIT_BIN" "${trans_args[@]}"
使用方法
- 将上述脚本保存为
/usr/bin/git(如果你用自定义PATH的话也可以放在其他优先级更高的路径下) - 给脚本添加执行权限:
chmod +x /usr/bin/git - 验证:执行
git commit -m "a human comment with \"important\" hints"即可正常识别参数。
通用拓展
该方案是通用的,可适配所有从WSL调用Windows侧程序的场景:只需要将GIT_BIN替换为目标Windows程序的路径,即可解决带空格、引号、换行的参数传递问题。
内容的提问来源于stack exchange,提问作者Radagast the Brown
相关产品推荐
相关产品推荐

