我正在用 bash 编写一个自动作业评分器。分级机编译一个程序并运行它。如果程序编译失败或运行失败(例如由于分段错误),等级应该是一个固定的小数字,例如5。否则,等级是程序输出的最后一行。
要获得最后一行,我可以这样做:
grade=$( ./a.out | tail -1 )
但这总是给出 0 的退出代码,即使 a.out 无法运行(例如未找到),所以我无法判断程序是否存在失败。
另一种选择是使用临时文件:
./a.out > temp
if [ $? -ne 0 ]
then
grade=0
else
grade=$( tail -1 temp )
fi
但是,如果有许多不同的进程同时执行相同的操作,这可能会出现问题。即使使用一个进程,当我只需要最后一行时,将所有输出保存在一个文件中(输出可能很大)也是一种浪费。
有没有不使用临时文件的解决方案?
如果该程序以非零退出状态退出或根本无法执行,这将尝试执行
./a.out
然后在其输出中添加一行。0
将0
被抓住tail -n 1
并放入$grade
.如果
./a.out
正确执行并以零退出状态终止,则echo
不会触发。/dev/null
如果您有兴趣查看与 running 相关的诊断消息,请删除标准错误的重定向./a.out
。改为
0
获取"$?"
退出代码。为了能够将数字与错误区分开来,您可能希望使用NaN
一些错误字符串来代替。您的问题归结为:“我想获得最后一行输出并在不使用临时文件的情况下检测异常退出”。在那种情况下,
set -o pipefail
是你的朋友。这是一个简单的脚本,它执行其参数并在正常退出时记录输出的最后一行:
我将把评分的问题留给你。