Назад | Перейти на главную страницу

bash: «set -e» и проверьте, существует ли пользователь, выполните выход из сценария

Я пишу сценарий для установки программы с помощью Bash. Я хочу выйти из-за ошибки, поэтому добавил set -e к началу моего сценария.

Я должен проверить, существует ли в моем скрипте пользователь. Для этого я использую grep ^${USER}: /etc/passwd. Если пользователь существует, сценарий работает нормально. Однако, если пользователь не существует, эта команда завершается. Я не хочу выходить в последнем случае. Вместо этого я хочу создать пользователя и продолжить установку.

Какое решение, чтобы мой скрипт продолжал работать? Я попытался перенаправить вывод grep в переменную, но у меня все еще та же проблема.

Вы всегда можете сделать что-то вроде ниже. В основном отключение проверки выхода для выполняемой команды.

#!/bin/bash
set -e # eanble exit checking
lorem ipsum 
dolor sit amet
# temp disable exit checking
set +e
grep "^${USER}:" /etc/passwd
set -e
consectetur adipiscing elit

В дополнение к уже приведенным предложениям, есть еще два варианта. Во-первых, вы можете предоставить альтернативную команду, которая гарантирует успех:

grep "^${USER}:" /etc/passwd || true

(В принципе, если grep команда не работает, это запустится true и поскольку это всегда удается, он будет считать составную команду успешной и не будет выходить из сценария.)

В качестве альтернативы, поскольку вас интересует успешность выполнения команды grep (то есть необходимость добавления пользователя), просто используйте ее как условие в if заявление:

if ! grep "^${USER}:" /etc/passwd; then
    # Create the user account
fi
# Continue installation...

(Обратите внимание, что ! перед grep команда отменяет тест, поэтому она запускает тело оператора if, только если grep терпит неудачу. поскольку grep является частью составной команды, сценарий не завершается в случае сбоя.)

Решение - не использовать set -e что может быть довольно опасно. Вместо этого используйте операторы if.

grep "^${USER}:" /etc/passwd &>/dev/null
if [ $? -eq 1 ]
then
    #create user here ...
ft

одно из предложений - запустить эту проверку и установить в подоболочке внутри (). это сработает для вас?