Как мне регистрировать ошибки из переменных в скрипте оболочки bash

#linux #bash #shell #variables #scripting

#linux #bash #оболочка #переменные #создание сценариев

Вопрос:

У меня есть рабочий скрипт, который выходит и проверяет, какие операционные системы запущены клиентом, а затем запускает код, относящийся к тому, который проверяет разницу в смещении NTP клиента относительно главного сервера.

Я хотел бы добавить в это некоторые записи ошибок, связанные с командами NTP, но не знаю, с чего начать. Любые указатели были бы весьма признательны.

 #!/bin/bash


OS=`uname`

case $OS in
        [Linux]*)
Host=`hostname`
Offset=`ntpq -p | grep -e '*' | awk '{print $9}'`
Date=`date  %D`
CADate=`ntpdate -q 10.102.80.1 | awk '/nt/ {print $0}' | awk '{print $10}'`
TimeDiff=$(echo  $Offset - $CADate | bc )

#Output 
echo "$Host" "|" "$Date" "|" "$TimeDiff" > NTP.mif

        ;;
        [SunOS]*)
Host=`hostname`
Offset=`ntpq -p | tail -1 | awk '{print $9}'`
Date=`date  %D`
CADate=`ntpdate -q 10.102.80.1 | tail -1 | awk '{print $10}'`
TimeDiff=$(echo $Offset - $CADate | bc)

#Output
echo "$Host" "|" "$Date" "|" "$TimeDiff" > NTP.mif
        ;;
        [AIX]*)
Host=`hostname -s`
Offset=`ntpq -p | grep -e '*' | awk '{print $9}'`
Date=`date  %D`
CADate=`ntpdate -q 10.102.80.1 | awk '/nt/ {print $0}' | awk '{print $10}'`
TimeDiff=$(echo  $Offset - $CADate | bc )

#Output
echo "$Host" "|"  "$Date" "|" "$TimeDiff" > NTP.mif
        ;;
esac
  

Комментарии:

1. В каком смысле регистрировать ошибки? Что такое «ошибка» в этом контексте?

2. Any pointers would be greatly appreciated. Начните с shellcheck.net

3. @AndrewDorsett : Старый добрый set -x ?

Ответ №1:

Важно понимать, что есть два вида ошибок:

  • Вы запускаете команду UNIX / Linux, и это идет не так.
  • Вы запускаете команду и видите результаты, которые вам не нравятся.

В первом случае результаты ошибок передаются в основной поток ошибок, известный как 1 . Ошибки можно перехватывать и записывать в файл журнала, вот так (я использую >> , поскольку предпочитаю добавлять к файлу журнала, а не воссоздавать с нуля):

 command 1>>logfile_error.txt
  

Для второго случая у вас есть что-то вроде:

 bad_result=$(command)
// check that the result is bad indeed
bad_result >>logfile_error.txt
  

(Во втором случае основной поток ошибок не имеет непосредственного значения)

Очевидно, что вы можете объединить оба:

 bad_result=$(command 1>>logfile_error.txt)
...
bad_result >>logfile_error.txt
  

Ответ №2:

В дополнение к перенаправлениям вывода вы можете условно решить, что должно быть записано / распечатано . .. поэтому вам может быть интересно использовать коды возврата, данные после выполнения команды, которые могут быть получены с помощью $?

https://www.tldp.org/LDP/abs/html/exit-status.html
https://www.tldp.org/LDP/abs/html/exit-status.html#FTN.AEN2981

просто пример использования:
(не совсем «хороший» — переписан в блокноте без дальнейшего тестирования, но все же может быть полезен для вас — могло бы быть лучше)

 #!/bin/bash

Host=`hostname`
OS=`uname`
ntp_ip=10.102.80.1
Date=`date  %D`

Offset_data=`ntpq -p`
Offset_rc=$? # you can a
if [[ $Offset_rc -ne 0 ]]; then
  echo "Unable to.."
  #exit $Offset_rc # - uncomment if you don't want to continue 
                   #   with the script if your ntp command failed
fi

CADate_data=`ntpdate -q $ntp_ip`
if [[ $? -ne 0 ]]; then # direct return code check
  echo "Unable to..,"
fi

case $OS in
        [Linux]*)
Offset=`echo $Offset_data | grep -e '*' | awk '{print $9}'`
CADate=`echo $CADate_data | awk '/nt/ {print $0}' | awk '{print $10}'`
        ;;
        [SunOS]*)
Offset=`echo $Offset_data | tail -1 | awk '{print $9}'`
CADate=`echo $CADate_data | tail -1 | awk '{print $10}'`
        ;;
        [AIX]*)
Offset=`echo $Offset_data | grep -e '*' | awk '{print $9}'`
CADate=`echo $CADate_data | awk '/nt/ {print $0}' | awk '{print $10}'`
        ;;
esac

TimeDiff=$(echo $Offset - $CADate | bc )
#Output
echo "$Host" "|" "$Date" "|" "$TimeDiff" > NTP.mif