Я пишу сценарий Bash, где я хочу выйти, если пользователь не root. Условно работает нормально, но скрипт не выходит.
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Я пытался использовать &&
вместо, ;
но ни одна из них не работает.
bash
shell
shell-script
scripting
Гарретт Холл
источник
источник
exit 1
чтобы понять родительский процесс, что возникла проблема.[[
для числового сравнения, используйте((
.[[
в порядке, пока вы используете-eq
вместо==
.(( EUID )) && ...
Скобки вокруг этих команд создают подоболочку . Ваш эшелон с эшелоном «Должен быть пользователем root для запуска скрипта», а затем вы указываете субоболочке выйти (хотя это уже произошло, поскольку больше не было команд). Самый простой способ исправить это, вероятно, просто использовать
if
:источник
id -u == 0
, что будет означать , что вы есть корень. Вы хотите[[ $(id -u) != 0 ]]; then
.[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1;
также обратите внимание$UID
, что экономит порождение процесса. Я думаю, вы могли бы даже предпочесть$EUID
.((UID)) && echo 'You have to be root.' && exit 1
.set -e
к прерыванию сценария . Одним из решений этой проблемы является[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true
.С баш :
источник
echo
сбой (например, потому что stdout не доступен для записи).Скобки вокруг
||
и&&
не обязательны, так как они являются ассоциативными справа. Следующие два выражения эквивалентны:Так что
&&
вместо того,;
чтобы работать просто отлично, так какecho
вернет истину.источник
это может помочь вам, в Баш
источник