Что делает команда "who | grep $1" в сценарии оболочки?
Я изучаю программирование оболочки с самых основ, используя книгу под названием "Начало программирования на Linux" (4-е издание). Я смущен этим сценарием с until
-clause:
#!/bin/bash
until who | grep "$1" > /dev/null
do
sleep 60
done
# Now ring the bell and announce the unexpected user.
echo -e '\a'
echo "***** $1 has just logged in *****"
exit 0
Мое сомнение в том, что who | grep "$1" > /dev/null
используется здесь? Зачем перенаправлять вывод grep на /dev/null
?
2 ответа
Как вы упомянули, цикл 'then' используется для проверки условия и будет запускать весь блок 'do | done' до тех пор, пока условие не станет истинным. Другими словами, он выполняет блок кода только тогда, когда присутствует условие FALSE, и запускает его, пока он не станет истинным. Скрипт, который вы тестируете, полезен для перехвата зарегистрированного пользователя, который вы передаете скрипту в качестве параметра (следовательно, grep "$1", то есть $ 1, позиционный параметр). Он будет спать в течение минуты (сон 60) до тех пор, пока этот пользователь не войдет в систему, а затем выйдет из цикла и выполнит все действия "$ 1 только что вошел". Перенаправление вывода grep на /dev/null используется для того, чтобы не отображать вывод команды grep (вы могли бы использовать grep -q "$1", и это дало бы тот же эффект).
Надеюсь прояснить ваши сомнения.
while
а также until
(и, по общему признанию, if
) посмотрите на код завершения теста, а не на любой текст, который может или не может быть сгенерирован на stdout (или stderr).
Я подозреваю, что причина перенаправления на /dev/null была в том, что команда генерирует выходные данные только в случае совпадения, большую часть времени (по общему признанию) нет, но когда это происходит, вам не интересно видеть результат.