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[@]}"
问题原因及修复方案
核心问题
isEmpty函数未定义:代码中调用的isEmpty是不存在的自定义函数,导致RETURN变量为空,后续判断完全失效。- 变量引用错误:
if [[ RETURN == *"Output"* ]]里的RETURN未加$符号,即便函数存在也无法正确读取变量值。 - 错误判断逻辑不可靠:依赖输出内容判断错误不如直接用命令退出状态码准确。
修复后的代码
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
相关产品推荐
相关产品推荐

