如何提醒 BASH 脚本编译 ConTeXt 文件时出现问题?

如何提醒 BASH 脚本编译 ConTeXt 文件时出现问题?

编译单个 ConTeXt 文件时,我可以通过查看最后几行并观察其编译情况来判断编译是否成功。

我有一个批处理文件,可以编译数千个 ConTeXt 文本文件。编译可能需要超过 24 小时。一个简单的例子是:

#!/bin/bash

for file in 1 2 3 4 5 6
do
    context $file\.tex
done

问题是,它遇到了错误3.tex,我无法真正检查,除非我花整整 24 小时观察文件的编译情况。出现错误时,ConTeXt 会退出,但 BASH 脚本会继续运行,并继续运行编译。通常,应该有 1,000 页的 PDF 却只有 1 页。有时,文件应该是 835 页,但它在 563 页时就坏了,但创建了一个 PDF。所以我不知道哪些 PDF 是坏的,哪些编译成功了。

我怎样才能输出一种长整型数据来告诉我哪些文件在编译过程中出现了错误?

答案1

记录编译失败的文件数量和名称。此信息带有日期和时间戳,因此可以保留以前的记录而不会产生歧义。

#!/bin/bash -
# set PATH explicitly here
# export PATH=/usr/local/bin:/usr/bin
logfile="${HOME}/context.log"
date >> $logfile
printf %b "\n" >> $logfile
failures=0

for file in 1 2 3 4 5 6; do
    context --nonstopmode "${file}.tex"
    if [ $? != 0 ]
    then
      printf %b "${file}.tex\n" >> $logfile
      ((failures+))
    fi
done

printf %b "${failures} failures.\n\n" >> $logfile

exit $failures

答案2

使用set -e。这将在调用的命令之一返回非零退出状态时立即终止 bash 脚本。也可以使用--nonstopmode(或者--batchmode,如果您不想要控制台输出),否则 ConTeXt 将在出现错误时等待用户输入。

#!/bin/bash

set -e;

for file in 1 2 3 4 5 6; do
    context --nonstopmode "${file}.tex"
done

另一种可能性是检查存储在中的退出状态$?

#!/bin/bash

# Clear error log
echo "" > error.log

for file in 1 2 3 4 5 6; do
    context --nonstopmode "${file}.tex";
    if [ $? -ne 0 ]; then
        echo "Error in file ${file}" >> error.log
    fi
done

相关内容