Как я могу "попытаться что-то сделать, а затем определить, не сработает ли он" в bash?

В ответе на предыдущий вопрос:

Как я могу использовать 'у меня есть root-доступ?' как условное выражение в bash?

Предложение "попытаться что-то сделать и определить, не сработало ли оно" вместо "проверить разрешение, а затем сделать что-то"

Я нашел много обоснований для этого, например:

Однако я нашел очень мало информации о том, как реализовать try/catch в bash. Я бы предположил, что это слишком легко, за исключением того, что то, что я нашел, кажется довольно сложным - используя функции или другие скрипты:

Я относительно новичок в bash, но запутался, что нет простой функции, аналогичной функции try на других языках.

в частности, я хотел бы сделать следующее:

CMD=`./path/to/script.sh`
if [ <echo $CMD | grep error is true> ]; then
        .. do this ..
else 
        .. do that ..
fi   

Ответ 1

if sudo chmod a-x /etc/shadow 2>/dev/null
then : Yes - I have root permissions
else : No - I do not have root permissions or /etc/shadow does not exist or ...
fi

Это выбирает операцию, которая не наносит урон, если она преуспевает (файл теневого пароля не должен быть исполняемым, вы можете сделать что-то вроде chmod o-w / - удалите общедоступное разрешение на запись из корневого каталога, если хотите), и проверьте что он работал, глядя на статус выхода команды. Это отбрасывает сообщение об ошибке - вы должны решить, имеет ли это значение.

"Судо" - это для повышения привилегий; если вы считаете, что пользователь уже должен быть "root", то опустите "sudo".

Ответ 2

Bash зависит от статуса выхода, поэтому нет эквивалента try/catch. Но это все еще мощно, чтобы соответствовать вашим потребностям.

Для простых случаев вы можете использовать

[[ your_test_expression ]] && commands

Это эквивалентно

if [[ your_test_expression ]]; then
    commands
fi

If использует "статус выхода" для [[...]], поэтому на самом деле вы можете использовать любую команду после If. Просто убедитесь, что ваша логика управления зависит от статуса выхода команды.

В сложных случаях для выражения вашей логики вам нужны операторы if или case.

Ответ 3

если только script, который вы вызываете, имеет условие выхода, вы мало что можете сделать. Однако найдите "установить" на странице bash man.

set -e

приведет к выходу script, если простая команда в нем завершится с ошибкой. Вы можете добавить его в начало script.sh в своем примере, чтобы заставить его выйти, если он не работает.

также посмотрим на ловушку. Я верю

trap 'exit 2' ERR

похож на