Я пишу сценарий для установки программы с помощью 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
одно из предложений - запустить эту проверку и установить в подоболочке внутри (). это сработает для вас?