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
相关产品推荐
相关产品推荐

