私はBashで自動宿題採点器を書いています。グレーダーはプログラムをコンパイルして実行します。プログラムがコンパイルまたは実行に失敗した場合(たとえば、分割エラーのため)、評価は5などの固定数字でなければなりません。それ以外の場合、レベルはプログラム出力の最後の行です。
最後の行を取得するには、次のようにします。
grade=$( ./a.out | tail -1 )
ただし、これはa.outを実行できない場合(たとえば見つからない場合)でも常に終了コード0を提供するため、プログラムが存在できないかどうかはわかりません。
別のオプションは一時ファイルを使用することです。
./a.out > temp
if [ $? -ne 0 ]
then
grade=0
else
grade=$( tail -1 temp )
fi
ただし、同時に同じ操作を実行する複数のプロセスがある場合、問題が発生する可能性があります。 1つのプロセスを使用しても、最後の行だけが必要なときにすべての出力を1つのファイルに保存するのは無駄です(出力はかなり大きくなる可能性があります)。
一時ファイルを使用せずに回避策がありますか?
ベストアンサー1
grade=$( { ./a.out 2>/dev/null || echo 0; } | tail -n 1 )
プログラムがゼロ以外の終了状態で終了するか、まったく実行に失敗した場合は、実行を試みて出力に1行を追加し./a.out
ます。つかまってに配置さ0
れます。0
tail -n 1
$grade
正しく実行され、./a.out
ゼロ終了状態で終了するとecho
トリガーされません。
/dev/null
実行関連の診断メッセージを表示するには、標準エラーリダイレクトを削除してください./a.out
。
終了コードを取得する0
にはに変更してください。"$?"
数値とエラーを区別するには、NaN
いくつかのエラー文字列を使用する必要があります。