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

Bash捕获libvips转PDF页面的stderr异常,错误数组未正确存储

问题:Bash脚本捕获libvips PDF转图片错误失败

我用libvips将PDF每页转换为图片,工具本身可正常工作,但想要捕获转换过程中出现的错误。测试时我将PDF页数设为10(实际仅有6页),能看到错误输出,但存储错误的数组始终为空,echo ${RETURN}也没有任何输出。

我的Bash代码:

num_pgs=10
#num_pgs is the number of pages in the PDF
DESTINATION="/home/user/file.pdf"
imagesStringPath="/home/user/file_"
errorsArray=()
for (( i=0; i<=${num_pgs}; i++ ))
do 
    #2>&1 to catch stderr to stdout
    OUT=$(vips copy ${DESTINATION}[page=$i,dpi=200] $imagesStringPath$i.png 2>&1)
    echo "OUTPUT: "${OUT};
    RETURN="$(isEmpty "${OUT}")"
    if [[ RETURN == *"Output"* ]]; then
        echo ${RETURN};
        errorsArray+=(${OUT})
    fi
done
echo "${#errorsArray[@]}"

问题原因及修复方案

核心问题

  1. isEmpty函数未定义:代码中调用的isEmpty是不存在的自定义函数,导致RETURN变量为空,后续判断完全失效。
  2. 变量引用错误:if [[ RETURN == *"Output"* ]]里的RETURN未加$符号,即便函数存在也无法正确读取变量值。
  3. 错误判断逻辑不可靠:依赖输出内容判断错误不如直接用命令退出状态码准确。

修复后的代码

num_pgs=10
DESTINATION="/home/user/file.pdf"
imagesStringPath="/home/user/file_"
errorsArray=()

for (( i=0; i<=${num_pgs}; i++ ))
do 
    # 捕获stderr到stdout,同时记录命令退出状态码
    OUT=$(vips copy "${DESTINATION}[page=$i,dpi=200]" "${imagesStringPath}${i}.png" 2>&1)
    EXIT_CODE=$?
    echo "OUTPUT: ${OUT}"

    # 通过退出状态码判断是否出错(正常转换退出码为0,出错则非0)
    if [[ $EXIT_CODE -ne 0 ]]; then
        errorsArray+=("$OUT")
        echo "捕获到错误:$OUT"
    fi
done

echo "总共捕获到 ${#errorsArray[@]} 个错误"

关键改进点

  • 用命令的**退出状态码$?**判断错误,这是最可靠的方式,避免依赖输出内容的不确定性。
  • 给文件路径添加双引号,防止路径包含空格时出现解析错误。
  • 数组添加元素时使用"$OUT",避免错误内容含空格时被拆分成多个数组元素。
  • 移除不存在的isEmpty函数,简化逻辑。

内容的提问来源于stack exchange,提问作者Dev Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:36:22