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

Другие вопросы по тегам