Bash脚本:结合IF语句获取命令错误文本及文件处理问题
在Bash脚本中捕获ocrmypdf的错误输出并结合IF判断
我完全懂你的需求——现在你的脚本已经能根据ocrmypdf的执行结果自动归档文件,但还想拿到具体的错误文本用来排查问题对吧?这其实很容易实现,核心是要捕获命令的标准错误输出(stderr),同时保留它的退出状态码来判断成功/失败。下面给你两种实用的实现方案:
方案一:用临时日志文件存储错误信息
这种方式适合需要把错误日志持久化保存的场景,比如后续要追溯问题:
#!/bin/bash # 确保目标目录存在,避免移动文件失败 mkdir -p ./processed ./error # 假设你遍历处理PDF文件,这里以单个文件为例 input_pdf="example.pdf" output_pdf="searchable_${input_pdf}" # 生成唯一的临时错误日志文件名 error_log="/tmp/ocrmypdf_err_$(date +%Y%m%d_%H%M%S).log" # 执行ocrmypdf,将错误输出重定向到日志文件 if ocrmypdf "$input_pdf" "$output_pdf" 2>"$error_log"; then # 执行成功:移动原文件到processed目录 mv "$input_pdf" ./processed/ echo "✅ OCR处理成功:$input_pdf 已移至processed目录" # 可选:删除临时日志(如果不需要) rm "$error_log" else # 执行失败:读取错误信息,移动原文件到error目录 error_details=$(cat "$error_log") mv "$input_pdf" ./error/ echo "❌ OCR处理失败:$input_pdf 已移至error目录" echo "错误详情:" echo "$error_details" # 把错误日志也归档到error目录,方便排查 mv "$error_log" "./error/$(basename "$input_pdf" .pdf)_error.log" fi
方案二:直接把错误信息存到变量(无需临时文件)
如果不需要持久化日志,只是想在脚本运行时输出错误信息,可以直接把stderr捕获到变量中:
#!/bin/bash mkdir -p ./processed ./error input_pdf="example.pdf" output_pdf="searchable_${input_pdf}" # 仅捕获stderr到变量,扔掉stdout(>/dev/null) error_msg=$(ocrmypdf "$input_pdf" "$output_pdf" 2>&1 >/dev/null) # 获取命令的退出状态码 exit_code=$? if [ $exit_code -eq 0 ]; then mv "$input_pdf" ./processed/ echo "✅ 处理成功:$input_pdf 已归档" else mv "$input_pdf" ./error/ echo "❌ 处理失败!错误信息如下:" echo "$error_msg" # 可选:把错误信息写入error目录的对应文件 echo "$error_msg" > "./error/$(basename "$input_pdf" .pdf)_error.txt" fi
关键知识点说明
2>"$error_log":把命令的标准错误输出(stderr,文件描述符2)重定向到指定日志文件2>&1 >/dev/null:把stderr合并到stdout(文件描述符1),然后把stdout扔掉,最终只保留stderr内容到变量- Bash的
if语句会直接根据命令的退出状态码判断:退出码为0(成功)时进入then分支,非0(失败)时进入else分支
内容的提问来源于stack exchange,提问作者Minxer
相关产品推荐
相关产品推荐

