У меня есть скрипт bash, который проверяет некоторые файлы журнала, созданные заданием cron, которые имеют временные метки в имени файла (с точностью до секунды). Используется следующий код:
CRON_LOG=$(ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log 2> /dev/null | sed 's/^[^0-9][^0-9]*\([0-9][0-9]*\).*/\1 &/' | sort -n | cut -d ' ' -f2- | tail -1 )
if [ -f "$CRON_LOG" ]; then
printf "Checking $CRON_LOG for errors\n"
else
printf "\n${txtred}Error: cron log for $CRON_NOW does not exist.${txtrst}\n"
printf "Either the specified date is too old for the log to still be around or there is a problem.\n"
exit 1
fi
CRIT_ERRS=$(cat $CRON_LOG | grep "ERROR" | grep -v "Duplicate tracking code")
if [ -z "$CRIT_ERRS" ]; then
printf "%74s[${txtgrn}PASS${txtrst}]\n"
else
printf "%74s[${txtred}FAIL${txtrst}]\n"
printf "Critical errors detected! Outputting to console...\n"
echo $CRIT_ERRS
fi
Так что этот фрагмент кода работает нормально, но сейчас я пытаюсь очистить свои скрипты и реализовать set -e на вершине всех из них. Когда я делаю это с этим сценарием, он завершается с кодом ошибки 1. Обратите внимание, что у меня есть ошибки из первого оператора, сбрасывающего в / dev / null. Это связано с тем, что в некоторые дни в файле есть слово «true», а в другие - «false». Во всяком случае, я не думаю, что это моя проблема, потому что скрипт выводит «Проверка xxxxx.log на наличие ошибок». перед выходом, когда я добавляю set -e к вершине.
Примечание: переменная $ CRON_DATE является производной от пользовательского ввода. Я могу выполнить точно такой же оператор из командной строки "$. / Checkcron.sh 01/06/2010", и он отлично работает без оператора set -e в верхней части скрипта.
ОБНОВЛЕНИЕ: я добавил "set -x" в свой скрипт и сузил проблему. Последний бит вывода:
Checking /map/etl/tektronix/logs/fetch_cron_false_010710054501.log for errors
++ cat /map/etl/tektronix/logs/fetch_cron_false_010710054501.log
++ grep ERROR
++ grep -v 'Duplicate tracking code'
+ CRIT_ERRS=
[1]+ Exit 1 ./checkLoad.sh...
Похоже, проблема возникает в этой строке:
CRIT_ERRS=$(cat $CRON_LOG | grep "ERROR" | grep -v "Duplicate tracking code")
Любая помощь приветствуется. :)
Спасибо,
Райан