удар: “набор-e” и проверка, если пользователь существует, заставляют сценарий выйти

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.

3
задан 9 November 2012 в 16:40
4 ответа

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

#!/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
7
ответ дан 3 December 2019 в 04:39

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

grep "^${USER}:" /etc/passwd &>/dev/null
if [ $? -eq 1 ]
then
    #create user here ...
ft
4
ответ дан 3 December 2019 в 04:39

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

1
ответ дан 3 December 2019 в 04:39

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

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 является частью составной команды, сценарий не завершается в случае сбоя.)

5
ответ дан 3 December 2019 в 04:39

Теги

Похожие вопросы