Как я могу "попытаться что-то сделать, а затем определить, не сработает ли он" в 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
похож на