Linux执行.sh文件提示No such file or directory?三种排查思路与TaoToken配置验证 1. 脚本明明就在眼前为什么 Linux 说 No such file or directory你大概率遇到过这个画面ls -l deploy.sh明明能看到文件./deploy.sh一敲回车终端却回你一句bash: ./deploy.sh: No such file or directory。第一反应是文件被删了再ls一次它还在。于是开始怀疑人生。这个报错在 Linux 下极具迷惑性因为它的字面意思和真实原因经常对不上。它不一定代表文件不存在更多时候代表内核找不到能解释这个文件的东西。拆开看Linux 执行一个脚本要同时满足三件事文件本身存在、文件有可执行权限、文件头部的解释器路径真实可用。任何一环断了报错都可能长成No such file or directory的样子。最常见的三类根因是这样的。第一类是换行符问题脚本在 Windows 上编辑过行尾是\r\n而 Linux 只认\n。这时候 shebang 那行会变成#!/bin/bash\r内核去找一个叫/bin/bash\r的解释器当然找不到于是报没有那个文件或目录——它说的其实是解释器不存在不是你的脚本不存在。第二类是 shebang 路径写错比如写成#!/bin/bash但系统里 bash 在/usr/bin/bash或者写了个根本不存在的路径。第三类是权限问题文件没有x位不过这种情况通常报Permission denied但如果配合其他因素也可能出现别的表现。这篇就按这三条线走一遍每条都给可复制的命令。排查完之后我会顺带讲一个容易被忽略的点当你的脚本里要调用大模型 API 时怎么用统一的 Key 和 API 通道把调用链验证清楚避免脚本本身没问题、却卡在鉴权上。适合刚接触 Linux 运维、CI/CD 脚本、或者自己写自动化部署脚本的同学。2. 排查前先备好工具TaoToken 统一 Key 与 API 通道在动手排查之前先说清楚为什么这里要提 TaoToken。很多.sh脚本不是单纯跑个echo而是要在里面curl一个大模型接口、跑个代码补全、或者触发一段 Agent 流程。脚本报No such file or directory修好之后下一步往往就是接口调不通而接口调不通的原因又常常是 Key 分散在多个环境、Base URL 写错、模型 ID 对不上。TaoToken 在这里扮演的角色是一个统一的 API 通道你用同一个 Key就能访问多种模型Base URL 固定模型 ID 按需切换。这样脚本里的调用配置可以收敛成一份排查时变量更少。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 这个不加 UTM。你需要提前准备三样东西我把它叫三件套Base URL、API Key、Model ID。这三样在后面的脚本配置里会反复出现缺一个都跑不起来。Base URL 统一用https://taotoken.net/api。API Key 到控制台生成入口是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 生成后复制保存它只显示一次。Model ID 则取决于你要调哪个模型可以在模型对话页先试一下地址是 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。如果你打算长期在脚本或 Agent 里用可以看下 Coding Plan入口是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite API Keys 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。为什么排查脚本错误要先备好这些因为脚本报错分两层一层是 shell 层面的文件/权限/编码问题另一层是脚本内部调用外部服务时的配置问题。把第二层的配置先固定成一份可复制的模板你排查第一层时就不会被到底是脚本坏了还是 Key 错了这种问题干扰。下面进入正题。3. 三种排查思路的可复制配置与命令这一节是全文的核心三条线分别对应换行符、解释器路径、权限。每条我都给完整命令和预期输出你照着敲就行。3.1 换行符排查用 vim 看 fileformat 并改成 unix先确认文件格式。用 vim 打开脚本vim deploy.sh进去之后不要急着编辑直接输入命令模式下的:set ff回车。如果显示fileformatdos那基本就是它了。改成 unix:set ffunix然后保存退出:wq再执行./deploy.sh大概率就通了。原理前面说过\r混进了 shebang内核把\r当成了路径的一部分。如果你不想进 vim也可以用file命令快速判断file deploy.sh输出里如果带CRLF line terminators就是 Windows 换行。批量转换可以用sedsed -i s/\r$// deploy.sh这条命令把每行末尾的\r删掉-i表示直接改原文件。改完再用file确认一次应该变成ASCII text或UTF-8 text不再有 CRLF。3.2 解释器路径排查修正 shebang 并确认解释器存在打开脚本第一行看看head -n 1 deploy.sh正常应该类似#!/bin/bash。如果路径写错比如#!/bin/bash但系统里没有或者写成了#!/usr/bin/env bash而 env 路径不对都会出问题。先确认解释器真实位置which bash常见输出是/bin/bash或/usr/bin/bash。把 shebang 改成实际路径。更稳妥的写法是用 env#!/usr/bin/env bash这种写法会去 PATH 里找 bash跨发行版兼容性更好。改完保存再执行。还有一种隐蔽情况shebang 后面带了参数但格式不对或者 shebang 那行前面有空格、BOM 头。BOM 头尤其坑Windows 记事本另存为 UTF-8 时可能加上\xEF\xBB\xBF导致 shebang 失效。检查方法xxd deploy.sh | head -n 1如果开头是efbb bf就是有 BOM。去掉 BOMsed -i 1s/^\xEF\xBB\xBF// deploy.sh3.3 权限排查chmod 加执行位并确认挂载选项确认文件有执行权限ls -l deploy.sh看第一列如果是-rw-r--r--说明没有x。加上chmod ux deploy.sh或者给所有用户加执行位chmod x deploy.sh再ls -l确认变成-rwxr-xr-x之类。然后执行。这里有个容易忽略的点如果脚本放在挂载的分区上而挂载时带了noexec选项即使有x位也执行不了。检查挂载选项mount | grep $(df -P deploy.sh | tail -n 1 | awk {print $6})如果看到noexec要么换目录要么重新挂载去掉该选项。这种情况在容器和某些云盘挂载里比较常见。3.4 把 TaoToken 调用配置写进脚本模板脚本能跑之后如果里面要调模型接口建议把配置抽成变量放在脚本顶部方便统一改。一个可复制的片段#!/usr/bin/env bash set -euo pipefail TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_API_KEY${TAOTOKEN_API_KEY:?请先导出 TAOTOKEN_API_KEY} TAOTOKEN_MODEL_ID你的模型ID response$(curl -sS -X POST ${TAOTOKEN_BASE_URL}/v1/chat/completions \ -H Authorization: Bearer ${TAOTOKEN_API_KEY} \ -H Content-Type: application/json \ -d { \model\: \${TAOTOKEN_MODEL_ID}\, \messages\: [{\role\: \user\, \content\: \ping\}] }) echo ${response}注意 Key 不要硬编码进脚本用环境变量传入。运行前export TAOTOKEN_API_KEY你的Key ./deploy.sh如果你用 Claude Code 这类工具配置里同样要写全三件套。以 settings 为例路径和字段按官方文档来Base URL 填https://taotoken.net/apiKey 填你的Model ID 填对应模型。文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。4. 验证请求确认脚本调用链真的通了排查完 shell 层的问题别急着收工要验证脚本内部的调用链。分两步先验证脚本本身能跑再验证接口能通。第一步跑一个最小脚本确认环境#!/usr/bin/env bash echo shell ok curl -sS -o /dev/null -w %{http_code}\n https://taotoken.net/api预期输出shell ok和一个 HTTP 状态码。如果状态码是 401说明没带 Key 或 Key 无效如果是 404检查路径如果是 200 或 405说明通道可达。第二步带上 Key 发一次真实请求curl -sS -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer ${TAOTOKEN_API_KEY} \ -H Content-Type: application/json \ -d { model: 你的模型ID, messages: [{role: user, content: 只回复 ok}] }成功的话会返回一段 JSON里面有choices字段。如果返回里没有choices或者报reading choices之类的解析错误说明响应结构和你预期的不一样先echo原始响应看看。第三步把这段调用嵌进你的.sh脚本用set -e让失败立即退出再跑一次完整流程。如果脚本能从头跑到尾并打印出模型回复说明 shell 层和 API 层都通了。我试过在 CI 里跑这种验证最省事的做法是把 Key 放在 CI 的 secret 里脚本里只引用环境变量这样本地和线上行为一致排查时不会因为环境差异反复横跳。5. 本篇常见报错对照排查这一节把几个高频报错和对应处理列出来方便你对照。bash: ./deploy.sh: No such file or directory优先查换行符和 shebang。用file看 CRLF用head -n 1看 shebang用xxd看 BOM。Permission denied查ls -l的x位chmod x补上再查挂载是否noexec。401 UnauthorizedKey 没传、传错、或过期。检查Authorization: Bearer头确认 Key 从 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 生成且未泄露失效。local proxy failed通常是本地网络或代理配置问题检查环境变量http_proxy、https_proxy是否指向了不可用的地址脚本里可以临时unset掉再试。reading choices相关解析错误响应不是预期的 JSON 结构先打印原始响应确认是不是返回了错误信息而不是正常结果。OAuth相关报错多见于 Claude Code 类工具的鉴权流程确认配置里 Base URL、Key、Model ID 三件套齐全且 Key 类型匹配。curl: (6) Could not resolve hostDNS 问题检查/etc/resolv.conf或网络连通性。bad interpreter: No such file or directoryshebang 路径错误用which确认真实路径后修正。排查顺序建议先file看格式再head看 shebang再ls -l看权限最后才怀疑网络和 Key。这个顺序能覆盖九成以上的情况。6. 把配置固定下来下次直接复用脚本排查这件事最怕每次重来。我的做法是准备一个check.sh模板把格式检查、shebang 检查、权限检查、接口连通性检查都串起来新脚本出问题先跑它。#!/usr/bin/env bash set -uo pipefail f${1:?用法: ./check.sh 脚本路径} echo 文件格式 file $f echo shebang head -n 1 $f echo 权限 ls -l $f echo 接口连通 curl -sS -o /dev/null -w HTTP %{http_code}\n https://taotoken.net/api跑法chmod x check.sh ./check.sh deploy.sh这样每次遇到No such file or directory先跑一遍基本能定位到是哪一层的问题。接口那层如果返回 401就去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 重新生成 Key如果模型 ID 不确定去 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 确认长期在脚本和 Agent 里用可以看 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入细节以 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 为准。最后留一个实用习惯所有.sh脚本统一用#!/usr/bin/env bash开头统一在 Linux 下编辑或保存为 LF统一chmod xKey 统一走环境变量。这三条做到了No such file or directory基本不会再找上门。