Когда некоторая команда (из сценария удара) сбои, сообщение об ошибке должно быть выпущено, и затем из сценария нужно выйти.
Позволяет просто показывают пример (с последней командой, перенесенной в строку эха для более легкого тестирования):
$ which which || echo "failed"; echo "exit 1"
/usr/bin/which
exit 1
$ which which1 || echo "failed"; echo "exit 1"
failed
exit 1
Поскольку Вы видите, что пример делает/exit/в любом случае. Вместо этого это только должно выйти для второго случая. Как решить это для достижения желаемого поведения? Я предполагаю, что существуют некоторые опции, встроенные в удар для группировки объектов команды № 2 и № 3...
Можно или использовать подоболочку, поскольку Вы показываете в своем ответе:
which which1 || ( echo "failed"; echo "exit 1" )
или группа команды, не запуская отдельную подоболочку:
which which1 || { echo "failed"; echo "exit 1"; }
Примечание: для получения дополнительной информации о { }
по сравнению с ( )
, посмотрите, что "Составные Команды" и "УПРАВЛЯЮТ СРЕДОЙ ВЫПОЛНЕНИЯ" разделы man bash
.
Или, можно сделать что-то вроде этого, что позволяет Вам создать более сложные обработчики:
#!/bin/bash
which "$1"
if [[ $? != 0 ]]; then
echo "Failed: Exited with $?"
exit 1
else
echo "Worked!"
fi
Вы могли также записать это как функцию:
#!/bin/bash
runme(){
"$@"
if [[ $? != 0 ]]; then
echo "Failed: Exited with $?"
exit 1
else
echo "Worked!"
fi
}
runme which which1
Или, проще если Вам не нужен статус выхода, который покажут:
#!/bin/bash
runme(){
if "$@"; then
echo "Worked"
else
echo "Failed!"
exit 1
fi
}
runme which which
Это очевидно решает его:
$ which which || ( echo "failed"; echo "exit 1" )
/usr/bin/which
$ which which1 || ( echo "failed"; echo "exit 1" )
failed
exit 1
Группировка команд в ударе сделана с помощью круглых фигурных скобок.