WSL单命令执行shell脚本提示‘go: not found’求助
问题根源:手动打开WSL时启动的是登录交互Shell,会自动加载~/.bashrc、~/.profile这类配置文件,其中包含Go的环境变量(比如PATH添加了Go的二进制目录);而用wsl -e sh script.sh执行时,启动的是非登录非交互Shell,不会加载这些配置,导致系统找不到go命令。
以下是几种可行的解决方法:
方法1:在脚本中指定Go的绝对路径
先在手动打开的WSL终端里执行which go,得到Go的绝对路径(比如/usr/local/go/bin/go),然后把脚本第48行的命令替换为:
/usr/local/go/bin/go build && ./hub-api
这种方法最直接,不依赖任何环境变量配置,避免Shell加载差异的问题。
方法2:在脚本开头加载环境配置文件
在你的script.sh最顶部添加一行,加载登录Shell的配置文件,比如:
. ~/.bashrc
或者如果你的Go环境变量是写在~/.profile里的,就改成:
. ~/.profile
这样脚本执行时会主动加载环境变量,就能找到go命令了。注意如果配置文件里有交互Shell专属的内容(比如命令提示符PS1设置),可能会输出一些冗余信息,可根据需要调整配置文件,把环境变量相关的内容单独提取到一个文件(比如~/.env),然后脚本里加载这个文件。
方法3:让WSL以登录Shell模式执行脚本
修改启动命令,让Shell以登录模式运行,自动加载环境配置:
- 如果用bash执行:
wsl --cd /path/to/script/ -e bash -l script.sh
bash -l表示启动登录Shell,会自动加载~/.bash_profile、~/.bashrc等配置。
- 如果坚持用sh执行:
wsl --cd /path/to/script/ -e sh --login script.sh
sh的登录模式会加载/etc/profile和~/.profile。
验证方法
可以先执行以下命令对比两种模式的PATH差异,确认问题:
# 非登录Shell的PATH wsl -e sh -c 'echo $PATH' # 登录Shell的PATH wsl -e sh --login -c 'echo $PATH'
如果登录Shell的PATH里包含Go的目录,说明方法3有效。
内容的提问来源于stack exchange,提问作者Eloy Fernández Franco

