WSL Ubuntu执行调用/bin/bash的Ruby脚本报目录不存在
WSL环境下脚本cd到/home子目录报不存在的排查方案
这个报错的核心原因是脚本执行时实际解析到的目标路径,和你手动交互时操作的路径不匹配,按出现概率从高到低排查即可:
- 最高发诱因:脚本带Windows格式换行符或不可见隐藏字符
如果你用Windows侧的编辑器(比如系统自带记事本、未开启WSL换行适配的编辑器)修改过这个Ruby脚本,文件会保留Windows特有的CRLF换行符,行尾的\r(回车符)是不可见字符,会被Bash识别为路径的一部分。比如你代码里写的cd /home/user/git_repo,实际解析时路径末尾多了个\r,系统自然找不到对应目录。你之前手动修改成cd /home/时是临时输入的内容,没有带这个隐藏字符,所以不会触发报错。
验证方式:在WSL终端执行cat -A /home/user/git_repo/bin/script.rb,查看写有cd命令的行末尾是否有^M标记,或是路径段中间夹杂M-开头的不可见控制字符。
修复方式:执行dos2unix /home/user/git_repo/bin/script.rb将文件转换为Unix的LF换行格式,或是在编辑器底部将行尾类型切换为LF后重新保存文件。 - 次高发诱因:跨侧调用WSL时默认发行版/默认用户不匹配
如果你是从Windows的CMD、PowerShell,或是Windows端的IDE插件(比如Code Runner、IDE内置的运行按钮)直接触发脚本执行,没有显式指定WSL运行参数,会默认使用WSL配置的root用户、或是其他已安装的WSL发行版实例运行:- 先在你手动能正常cd进目录的WSL终端里执行
echo "$WSL_DISTRO_NAME" "$USER",记录返回的发行版名称和当前用户名 - 检查触发脚本运行的调用命令,是否存在指定错误用户、错误发行版的问题——不同WSL发行版的文件系统是完全隔离的,A实例里的/home/user目录在B实例里根本不存在
- 修复方式:调用脚本时显式追加参数指定对应发行版和用户,例如
wsl -d Ubuntu-22.04 -u user ruby /home/user/git_repo/bin/script.rb
- 先在你手动能正常cd进目录的WSL终端里执行
- 低发诱因:脚本内路径拼接逻辑异常
检查脚本中cd命令的写法,如果是用变量拼接路径(例如cd "#{ENV['HOME']}/git_repo"),要确认脚本执行时的环境变量和你手动终端的环境变量一致:sudo执行脚本时HOME变量会默认指向/root,IDE调用脚本时往往不会加载用户目录下的.bashrc/.zshrc配置,很容易出现变量值不符合预期的问题。
验证方式:在脚本的cd命令前加几行调试代码:
运行脚本后对比输出的/home目录内容和你手动执行target_path = "/home/user/git_repo" puts "目标路径:#{target_path},路径是否存在:#{Dir.exist?(target_path)}" puts "/home目录下的内容:#{Dir.entries('/home')}"ls /home的结果,就能直接定位执行环境的差异。
提示:如果是目录权限不足,Bash会明确返回
Permission denied报错,和当前的No such file or directory报错特征完全不符,不需要在目录权限配置上浪费排查时间。
内容的提问来源于stack exchange,提问作者KoRaL-
相关产品推荐
相关产品推荐

