You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本新手求助:运行可执行文件main时提示文件不存在

解决Shell脚本中找不到main可执行文件的问题

嗨,我来帮你排查这个问题~ 你遇到的./main: No such file or directory报错,核心原因是路径的相对位置变了:

你用cd "$d"进入子目录后,当前的工作目录就变成了那个子目录,此时你写的./main会试图在这个子目录里找可执行文件,但你的main明明在脚本原本所在的目录,自然找不到啦。

给你两个简单的解决办法,选哪个都行:

方法一:用绝对路径指向main(最稳妥)

先获取脚本所在的绝对目录,再用这个目录拼接main的路径,这样不管你进入哪个子目录,都能精准找到它:

# 先拿到脚本所在的绝对路径目录
script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
# 用绝对路径定义main的位置
exec="$script_dir/main"

# 后面的循环逻辑保持不变,去掉多余的括号简化写法
for d in ./subdir/subdir2/*/ ; do
    (cd "$d" && for f in *.xml ; do
        echo "$f"
        "$exec" < "$f" > "${f%.*}_output.csv"
    done )
done

方法二:如果脚本和main在同一目录,也可以提前保存原目录

进入子目录前先记录当前目录,然后用相对原目录的路径调用main:

# 保存脚本运行时的初始目录
original_dir=$(pwd)
exec="./main"

for d in ./subdir/subdir2/*/ ; do
    (cd "$d" && for f in *.xml ; do
        echo "$f"
        # 用原目录的相对路径调用main
        "$original_dir/$exec" < "$f" > "${f%.*}_output.csv"
    done )
done

额外小提示

  • 先确认main确实有可执行权限,如果没有的话,记得先跑chmod +x main给它加权限。
  • 你原来脚本里的内层括号(echo "$f" && ("$exec" ...))其实没必要,因为外层的(cd "$d" && ...)已经是一个子shell了,直接写命令就行,代码会更简洁。

内容的提问来源于stack exchange,提问作者fdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:47:18