У меня давно была такая проблема. Проверьте свою память (RAM), используя тест памяти, поставляемый с fedora и ubuntu DVD.
grade=$( {./a.out 2>/dev/null || echo 0; } | tail -n 1 )
Это попытается выполнить ./a.out
, а затем добавить строку с одним 0
в свой вывод, если эта программа завершилась с не -нулевым статусом выхода или вообще не смогла выполниться. 0
будет пойман tail -n 1
и помещен в $grade
.
Если ./a.out
выполняется правильно и завершается с нулевым статусом выхода, echo
не срабатывает.
Удалите перенаправление стандартной ошибки на /dev/null
, если вы заинтересованы в просмотре диагностических сообщений, связанных с запуском ./a.out
.
Измените 0
на "$?"
, чтобы вместо этого получить код выхода. Чтобы иметь возможность отличить число от ошибки, вы можете вместо этого использовать NaN
или какую-либо строку ошибки.
Ваша проблема сводится к :"Я хочу получить последнюю строку вывода И обнаружить аварийный выход без использования временных файлов". В таком случае set -o pipefail
— ваш друг.
Вот простой скрипт, который выполняет свои аргументы и записывает последнюю строку вывода при обычном выходе:
#!/bin/bash
[[ -x $1 ]] || {
echo >&2 "Usage ${0##*/} <PROGRAM> [ARG1]..."
exit 1
}
set -o pipefail
program=$1
shift;
x=$($program "$@" | tail -1)
if [[ $? -eq 0 ]]; then
echo "Pass: $x"
else
echo "Fail: $?"
fi
Я оставлю вам проблему выставления оценок.