Что вы подразумеваете под "выкинуть и повторить ошибку"?Если вы хотите, чтобы сценарий завершался сразу же после сбоя какой-либо команды, просто выполните команду
set -e # DON'T do this. See commentary below.
в начале сценария (но обратите внимание на предупреждение ниже).Не пытайтесь повторить сообщение об ошибке: пусть ошибочная команда справится с этим.Другими словами, если вы выполните:
#!/bin/sh
set -e # Use caution. eg, don't do this
command1
command2
command3
и команда2 завершится неудачно, когда вы печатаете сообщение об ошибке в stderr, тогда, похоже, вы достигли того, чего хотите.(Если я неверно истолковываю то, что вы хотите!)
Как следствие, любая команда, которую вы пишете, должна вести себя хорошо: она должна сообщать об ошибках в stderr вместо stdout (пример кода в вопросе печатает ошибки в stdout) ион должен выйти с ненулевым статусом, когда он терпит неудачу.
Однако я больше не считаю это хорошей практикой.set -e
изменил свою семантику с разными версиями bash, и хотя он отлично работает для простого скрипта, существует так много крайних случаев, что он по сути непригоден для использования.(Рассмотрим такие вещи, как: set -e; foo() { false; echo should not print; } ; foo && echo ok
Семантика здесь несколько разумна, но если вы преобразуете код в функцию, которая полагается на настройку параметра для преждевременного завершения, вы можете легко получить укус.) ИМО лучше написать:
#!/bin/sh
command1 || exit
command2 || exit
command3 || exit
или
#!/bin/sh
command1 && command2 && command3