Azure DevOps执行Shell脚本提示filename.json是目录报错排查
报错根因
这个报错和路径是否加引号没有任何关系——引号仅用于处理路径中包含空格、特殊字符的转义场景,不会改变路径对应文件系统对象的实际类型。报错已经明确提示:/home/vsts/work/1/s/Oldtemplate/filename.json在流水线运行的代理环境中,实际就是一个目录,而非你预期的文件。
常见触发场景有三类:
- 流水线前置步骤误创建了同名目录:比如执行过带错误路径的
mkdir命令、解压压缩包时带了同名目录结构、使用Azure DevOps内置的拷贝/发布构件任务时配置错误(拷贝单文件时将目标路径写为完整文件路径而非上层目录,任务会自动创建同名目录),原本的文件被同名目录覆盖。 - 工作目录残留:之前的流水线运行生成过同名目录,当前流水线拉取代码时未开启工作目录清理,旧目录没有被删除,新拉取的文件无法覆盖同名目录项。
- Linux文件系统大小写敏感:仓库中实际文件名大小写和脚本硬编码的路径不一致(比如实际文件是
Filename.json),部分代理环境的路径解析逻辑会将不存在的文件路径异常识别为目录。
修复方案
- 先定位实际问题:在执行
comm命令前插入两行排查命令,确认路径实际状态:
运行流水线后看这两行的输出,就能确认该路径确实是目录,同时能看到目录内的内容,反向定位是哪个前置步骤生成了这个异常目录。# 列出Oldtemplate目录下所有内容,看filename.json的类型标记 ls -la /home/vsts/work/1/s/Oldtemplate/ # 直接检测目标路径的文件类型 file /home/vsts/work/1/s/Oldtemplate/filename.json - 对应根因修复:
- 若为工作目录残留:要么在流水线Checkout步骤开启「清理工作目录」配置,要么在脚本最开头、所有文件操作步骤之前加删除命令清理异常路径:
rm -rf /home/vsts/work/1/s/Oldtemplate/filename.json - 若为前置任务配置错误:检查所有操作Oldtemplate目录的步骤:拷贝单文件到目录时,目标路径要以上层目录结尾(即写到
/home/vsts/work/1/s/Oldtemplate/即可,不要把目标文件名拼到路径里);如果是解压场景,检查压缩包内部是否自带了同名的filename.json目录。 - 若为大小写不匹配:直接用
ls输出的实际文件名替换脚本里的硬编码路径即可。
- 若为工作目录残留:要么在流水线Checkout步骤开启「清理工作目录」配置,要么在脚本最开头、所有文件操作步骤之前加删除命令清理异常路径:
- 你写的
comm+进程替换+sort -u的命令逻辑本身没有问题,修复路径对应的文件类型问题后即可正常运行,不需要调整命令本身的写法。
内容的提问来源于stack exchange,提问作者Hanscastor
相关产品推荐
相关产品推荐

