终端里敲下 ./run.sh,回车蹦出一句 bash: ./run.sh: No such file or directory,ls 一看文件明明就在那。no such file 这句报错看着直白,坑却不少,文件存在也照样报。
先查最普通的两种
一是路径不对。相对路径是从当前目录算的,先 pwd 看看自己在哪,该 cd 的 cd。二是大小写,Linux 严格区分 Readme.txt 和 readme.txt,从 Windows 拷过去的文件经常栽在这。
脚本存在却报错的三种情况
第一种,解释器路径写错了。脚本第一行 shebang 指向的程序不存在,执行时也会报 No such file or directory。用 head -1 run.sh 看第一行,里面写的解释器路径如果已经废弃,改成实际存在的路径。
第二种,Windows 换行符。在 Windows 上编辑过的脚本,行尾多了个 CR 字符,报错时解释器路径后面会跟个 ^M。装 dos2unix 转一下,或者编辑器里把换行符改成 LF。配置文件、证书从 Windows 拷到服务器,也建议顺手转一遍。
第三种,跑二进制程序时报这个错,多半不是程序文件丢了,而是它依赖的动态库找不到。用 ldd 程序名 看依赖列表,哪个库后面标着 not found,就把那个库装上。
还有两个隐蔽场景
- 文件名里混进了不可见字符,比如复制粘贴带进来的控制符,用 ls -b 看转义后的名字
- 符号链接指向的目标被删了,链接本身还在,ls 看着正常,一执行就报错,用 ls -l 看箭头指向
排查顺序建议固定下来:先 pwd 确认目录,再核对文件名大小写和隐藏字符,然后查 shebang 和换行符,最后用 ldd 查库。九成的 no such file 都倒在前三步。