2>&1
означает, "отправляют stderr в stdout".
>>/dev/null
означает, "добавляют stdout к/dev/null", который является способом скрыть программу, произведенную путем отправки его в /dev/null
, чей только цель в жизни состоит в том, чтобы действовать как черная дыра данных. (Строго говоря, для /dev/null
, >>/dev/null
совпадает с >/dev/null
.)
Эти правила оценены справа налево, таким образом, в комбинации они говорят, "скройте все вывод к stderr и stdout". Частая ошибка состоит в том, чтобы указать их в обратном порядке, который не скроет вывод stderr.
Также стоящий знания: можно явно отправить оба потока в /dev/null
путем высказывания 1>/dev/null 2>/dev/null
или &>/dev/null
вместо того, чтобы отправить stderr в stdout и затем отправить stdout в /dev/null
.
Вы всегда можете сделать что-то вроде ниже. В основном отключение проверки выхода для выполняемой команды.
#!/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
Решение состоит в том, чтобы не использовать set -e
, что может быть довольно опасным. Вместо этого используйте операторы if.
grep "^${USER}:" /etc/passwd &>/dev/null
if [ $? -eq 1 ]
then
#create user here ...
ft
одно из предложений - запустить эту проверку и установить в подоболочке внутри (). это сработает для вас?
В дополнение к уже приведенным предложениям, есть еще два варианта. Во-первых, вы можете предоставить альтернативную команду, которая гарантирует успех:
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
является частью составной команды, сценарий не завершается в случае сбоя.)