1. Linux 执行 .sh 报 No such file or directory 到底在报什么
No such file or directory这个报错在 Linux 下执行.sh脚本时特别有迷惑性:文件明明就在当前目录,ls也能看到,权限也给了+x,但一执行就提示找不到文件。这个报错的核心检索词就是Linux 执行 .sh 报 No such file or directory,它本质上不是「文件不存在」,而是「解释器找不到」或者「文件格式让内核读不懂」。
先说清楚它适合谁看:如果你是从 Windows 迁移脚本到 Linux、用编辑器另存过.sh、或者从压缩包/共享目录里直接跑脚本,大概率会撞上这个坑。它能在三类场景里出现——文件是 DOS 换行格式、shebang 指向的解释器路径不对、文件系统挂载带了noexec。这三种原因的报错文字一模一样,所以排查时不能只看这一句话,要顺着「内核怎么解析这个文件」的思路往下拆。
我先把结论摆出来:内核执行脚本时,先读文件头两个字节判断是不是#!,如果是,就按 shebang 后面写的解释器路径去启动;如果文件是 CRLF 换行,shebang 行末尾会多一个\r,内核会把它当成解释器路径的一部分,于是去找一个叫/bin/bash\r的程序,自然找不到。这就是为什么「文件在、权限对」却依然报 No such file or directory。
下面按「先定位、再修复」的顺序,给你三种可复制的解法,并演示怎么用 TaoToken 统一 Key 在settings.json里配一个 AI 辅助排查通道,让模型帮你读报错、给命令。整套流程不需要你记一堆参数,照着敲就行。
2. 用 TaoToken 统一 Key 搭一个 AI 排查通道
在动手改脚本之前,先解决「遇到报错没人问」的问题。TaoToken 是一个统一的大模型 API 接入通道,官网是 https://taotoken.net/?utm_source=taotoken_aic_blog&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。它的作用是:你只拿一个 Key,就能在同一个 Base URL 下调用不同模型,不用为每个模型单独配一套鉴权和地址。对于排查No such file or directory这种需要反复贴报错、让模型给命令的场景,统一 Key 能省掉很多切换成本。
你需要先拿到 Key。登录后进控制台,在 API Keys 页面创建一个:https://taotoken.net/console/api-keys?utm_source=taotoken_aic_blog&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。创建完复制那串sk-开头的字符串,后面配置里要用。注意 Key 只显示一次,丢了就重建一个。
拿到 Key 之后,核心是三件套:Base URL、Key、Model ID。Base URL 统一填https://taotoken.net/api,Key 填你刚复制的,Model ID 按你实际要用的模型填。这三样在下面每个工具的配置里都会出现,格式保持一致,换工具只改字段名不改值。
如果你更想直接在网页里跟模型对话、把报错粘进去问,可以用模型对话入口:https://taotoken.net/models?utm_source=taotoken_aic_blog&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。如果是要长期做编码和 Agent 任务,走 Coding Plan 更划算:https://taotoken.net/coding-plan?utm_source=taotoken_aic_blog&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。这两个入口和 API Key 是同一套账号体系,Key 通用。
注意:Base URL 只写到
/api,不要自己拼/v1/chat/completions之类的后缀,客户端会自动补。写多了会 404。
3. 可复制配置:settings.json 与三种脚本修复骨架
这一节给你两份东西:一份是 AI 辅助排查工具的settings.json配置骨架,一份是三种脚本修复的可复制命令。先配工具,再修脚本。
3.1 settings.json 配置骨架
很多 CLI 工具和编辑器插件都读settings.json。下面这份是通用骨架,路径按你实际工具放,字段名以工具文档为准,但 Base URL、Key、Model ID 三件套的值不变:
{ "ai": { "provider": "taotoken", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的Key粘贴到这里", "model": "你的ModelID", "timeout": 60000 }, "shell": { "defaultInterpreter": "/bin/bash", "checkFileFormat": true } }如果你用的是 Claude Code 这类工具,配置项名字可能叫env或model,但baseUrl和apiKey的写法一致。配好后重启工具,让它重新读配置。这一步做完,你就能在工具里直接问「这个报错怎么修」,模型会结合你贴的file、head -1输出给命令。
3.2 解法一:改文件格式(CRLF 转 LF)
这是最常见的原因。先用命令确认:
file your_script.sh如果输出里有CRLF line terminators,就是它了。用vim修:
vim your_script.sh进去后输入:
:set ff显示fileformat=dos就说明是 DOS 格式。改成 unix:
:set ff=unix :wq保存退出再执行。如果不想进交互界面,用sed一条命令搞定:
sed -i 's/\r$//' your_script.sh这条命令把每行末尾的\r删掉,等价于dos2unix。系统里装了dos2unix的话更直接:
dos2unix your_script.sh3.3 解法二:修正 shebang 解释器路径
如果file显示是ASCII text而不是 CRLF,那看第一行:
head -1 your_script.sh正常应该是#!/bin/bash或#!/usr/bin/env bash。如果写的是#!/bin/sh但系统里/bin/sh指向了不存在的路径,或者写了个不存在的解释器,也会报同样的错。确认解释器存在:
ls -l /bin/bash /usr/bin/env不存在就改成存在的路径,比如:
sed -i '1s|.*|#!/usr/bin/env bash|' your_script.sh用env bash的好处是它会去PATH里找 bash,不写死路径,迁移到别的机器更稳。
3.4 解法三:检查权限与挂载选项
权限不够通常报Permission denied,但如果文件系统挂载带了noexec,执行时会报No such file or directory或Permission denied,容易混。先看挂载:
mount | grep "$(df --output=target your_script.sh | tail -1)"如果看到noexec,说明这个分区不允许执行程序。换到允许执行的分区,或者重新挂载去掉noexec(需要 root):
sudo mount -o remount,exec /your/mount/point权限本身也要给:
chmod u+x your_script.sh然后确认当前用户对文件有读权限,因为内核要先读 shebang 才能执行。
4. 验证请求:确认脚本能跑、AI 通道能通
修完脚本,先验证脚本本身:
bash -x your_script.sh-x会打印每条执行的命令,能跑通就说明格式和解释器都没问题。如果直接./your_script.sh还报错,但bash your_script.sh能跑,那问题一定在 shebang 或执行权限上,回到 3.3 和 3.4 再查。
再验证 AI 通道。用curl打一次接口,确认 Key 和 Base URL 对:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "你的ModelID", "messages": [{"role": "user", "content": "回复 ok"}] }'返回里能看到choices字段和内容,就说明通道通了。如果返回 401,是 Key 错了或没带Bearer;如果返回 404,多半是 URL 拼错了,检查是不是多写了后缀。这一步通了,你就能把file your_script.sh和head -1 your_script.sh的输出贴给模型,让它直接给修复命令。
实测下来,把报错原文、file输出、head -1输出三样一起贴,模型给的命令命中率最高。只贴一句No such file or directory,模型只能猜,容易让你白改一通。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
配 AI 通道时,报错和脚本报错是两码事,别混。下面几个是高频的。
401 Unauthorized:Key 错、过期、或者请求头没写Authorization: Bearer sk-xxx。检查settings.json里apiKey有没有多余空格,curl里Bearer和 Key 之间是一个空格。重建 Key 后记得同步更新所有配置文件。
local proxy failed:工具本地代理没起来,或者代理端口和配置里的不一致。先确认工具进程在跑,再看settings.json里有没有写proxy字段指向一个没启动的端口。把代理相关字段删掉,直连https://taotoken.net/api试一次。
reading choices 报错:通常是返回体不是预期 JSON,比如返回了 HTML 错误页。用curl -i看状态码和Content-Type。如果Content-Type是text/html,说明请求打到了错误地址,检查 Base URL 是不是写成了首页而不是/api。
OAuth 相关报错:有些工具默认走 OAuth 登录而不是 API Key,配置里要显式指定用 Key 模式。找到auth或login相关字段,切成apiKey模式,填三件套。如果工具同时支持 OAuth 和 Key,优先用 Key,排查链路更短。
注意:脚本报
No such file or directory和 API 报 401 是两层问题。先把脚本修到能跑,再修 AI 通道,别一边改脚本一边调 Key,会互相干扰。
6. 把 AI 排查接进日常:模型对话与 Coding Plan 怎么选
脚本修好、通道验证通过之后,日常怎么用更顺?分两种。临时问一句、贴个报错让它给命令,用模型对话就够:https://taotoken.net/models?utm_source=taotoken_aic_blog&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。它适合「这个报错啥意思」「这条 sed 命令对不对」这种一次性问题,不用配工具,网页里直接聊。
如果你要长期做编码、写 Agent、批量处理脚本,走 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aic_blog&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。它按编码场景优化,配合settings.json里的三件套,能在编辑器或 CLI 里持续用同一个 Key,不用每次重新配。Key 还是那个 Key,Base URL 还是https://taotoken.net/api,只是入口不同。
最后给个实用技巧:把常用的排查命令写成一个check.sh,内容就是file、head -1、mount | grep三行,遇到脚本报错先跑它,把输出贴给模型。这样你每次问 AI 都带着完整上下文,模型给的命令基本一次就对。脚本格式、解释器、挂载这三样查完,No such file or directory基本就无处可藏了。