Скрипт оболочки, обнаруживающий ошибки из команды, вызываемой скриптом

1

Я вызываю приложения из своего сценария оболочки, который последовательно выполняет ряд важных шагов, один из которых приведен ниже:

for database in $( 
        echo 'show databases;' | 
        mysql --defaults-extra-file=/etc/sqlbackup/my.cnf \
              -e 'show databases' -s --skip-column-names|
        grep -vi information_schema )
do
  echo $database
done
exit 0

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

Мой вопрос: что произойдет, если приложение (любая командная строка, вызванная из скрипта), не сможет подключиться и выдало ошибку, такую ​​как:

`ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)`?

Сообщается ли об ошибках в отдельной переменной среды вне строки вывода, и если да, то как я могу это обнаружить? Как изменить путь сценария в зависимости от успеха или неудачи?

Я программист .Net, и лучшая аналогия, которую я могу сделать, - это когда исключение выдается и обрабатывается:

catch (Exception e)
{
  // log the reason here: echo "error running database command: " + e.Description
}

Есть ли что-то похожее на вышеперечисленное, кроме как в оболочке borne / bash?

g18c
источник
Читать все или только о перенаправлении Вот а также Вот , Если ничего из этого не имеет смысла, вы должны проверить Баш для начинающих а также ABS , Счастливого обучения!
Ярослав Рахматуллин

Ответы:

3

Существует три основных потока данных: ввод, вывод и ошибка.

  • Ввод ввода

  • Стандартный вывод

  • Стдерр это ошибка

Вы можете перенаправить сообщения об ошибках, добавив это 2>file.log в конце вашей команды.

Это будет записывать ошибки в файл журнала, который вы могли бы прочитать с tailf file.log - на отдельном экране, если хотите.

$( echo 'show databases;' | /usr/bin/mysql --defaults-extra-file=/etc/sqlbackup/my.cnf -e 'show databases' -s --skip-column-names 2>>file.log |grep -vi information_schema )

Если вам нужно больше деталей, посмотрите здесь: http://www.cyberciti.biz/faq/redirecting-stderr-to-stdout/

mnmnc
источник
Спасибо за ответ. Как насчет проверки кодов ошибок, а не только текста, чтобы подтвердить, что произошла ошибка и выбрать другой маршрут в сценарии?
g18c
@ g18c Вы можете использовать $? проверить код выхода последней команды. Смотрите пример здесь: blog.yimingliu.com/2009/01/01/...
mnmnc