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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:39:50