Linux运维脚本应提前用[[ -f ]]校验文件存在性并配合-r检查可读性,避免依赖set -e;对动态文件需捕获stderr解析“No such file”错误;结合set -euo pipefail与trap ERR兜底,并规范路径写法防误判。

Linux运维脚本捕获“文件不存在”错误,关键不是等命令崩溃后再处理,而是提前判断、主动拦截、明确反馈。这类错误(如 No such file or directory)通常出现在 cat、source、read、cp、tar -xf 等操作中,直接依赖 set -e 往往不够——因为某些命令(如 ls file.txt)失败时只是返回非零码,而像 grep pattern file.txt 在文件不存在时会报错并退出,但若未加防护,脚本仍可能继续执行后续逻辑。
用 test 或 [[ -f ]] 提前校验文件存在性
这是最直接、最可控的方式。在打开或使用文件前,先确认它真实存在且可读:
-
推荐写法:
if [[ ! -f "$CONFIG_FILE" ]]; then log "Config file missing: $CONFIG_FILE"; exit 1; fi -
-f判断是否为普通文件(排除目录、设备、符号链接等);用-r可进一步检查是否可读:[[ -f "$FILE" && -r "$FILE" ]] - 避免只用
ls $FILE &>/dev/null这类方式——它无法区分“无权访问”和“根本不存在”,也不支持空格路径
对关键命令显式捕获并解析错误原因
有些场景必须尝试打开(比如动态生成的临时文件),这时需捕获命令退出状态和 stderr 内容:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 用
command+$?+2>&1组合定位问题:
if ! output=$(cat "$INPUT_FILE" 2>&1); then<br> if echo "$output" | grep -q "No such file"; then<br> log "Input file not found: $INPUT_FILE"<br> else<br> log "Read failed for other reason: $output"<br> fi<br> exit 1<br> fi - 对
source这类内置命令,必须用子 shell 或函数封装后判断:if ! (source "$CFG" 2>/dev/null); then log "Failed to load config $CFG"; exit 1; fi
结合 set -euo pipefail + trap 做兜底防护
即使做了前置检查,也不能排除竞态条件(如文件在判断后、打开前被删除)。因此需叠加运行时防护:
- 脚本开头固定启用:
set -euo pipefail——其中-e能让cat、grep等命令失败时立即终止脚本 - 用
trap捕获 ERR 事件,输出更精准上下文:trap 'log "File error at line $LINENO: $(tail -n1 /proc/$$/fd/2 2>/dev/null | sed "s/.*: //")"' ERR
(配合重定向 stderr 到日志,可提取最后一条错误信息) - 对 curl/wget 下载类操作,单独检查 HTTP 状态码比依赖文件是否存在更可靠:
curl -f -s -o "$DEST" "$URL" || { log "Download failed: $URL"; exit 1; }
避免常见误操作
很多“文件不存在”问题其实源于路径误判,而非真正缺失:
- 不写绝对路径:cron 或 systemd 中执行时,当前工作目录不确定,
./config.conf极易失败 → 统一用/etc/myscript/config.conf或定义SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - 忽略 tilde 展开:
~/.myconf在非交互式 shell(如 cron)中不会自动展开 → 改用$HOME/.myconf - 变量未引号包裹导致路径截断:
cat $FILE_PATH遇到含空格路径会拆成多个参数 → 必须写成cat "$FILE_PATH"

















