Как я могу "попытаться что-то сделать, а затем обнаружить, что это не удается" в Bash? - PullRequest
4 голосов
/ 31 августа 2011

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

Как я могу использовать «У меня есть root-доступ?» как условно в bash?

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

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 31 августа 2011
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 / - удалить общедоступное разрешение на запись из корневого каталога, если хотите)и проверьте, что это сработало, посмотрев на состояние выхода команды.Это отбрасывает сообщение об ошибке - вы должны решить, имеет ли это значение.

Для повышения привилегий существует «sudo»;если вы считаете, что пользователь уже должен быть пользователем root, пропустите sudo.

1 голос
/ 31 августа 2011

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

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

[[ your_test_expression ]] && commands

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

if [[ your_test_expression ]]; then
    commands
fi

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

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

0 голосов
/ 31 августа 2011

, если в вызываемом вами скрипте нет условия выхода, вы ничего не можете сделать. Однако посмотрите "set" на странице руководства bash.

set -e

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

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

trap 'exit 2' ERR

похоже

...