Сценарий, вероятно, является примером, и вы должны изменить echo goodbye
, чтобы сделать что-то еще.
Предположим, что сценарий называется demo
. Когда вы запускаете его, как вы видели, он сначала выводит «привет». Затем он видит, идет ли вывод на терминал или нет, с намерением решить, используете ли вы
demo
или
demo | some other program
. Если это первый, то он просто отправляет вывод остальной части файла в файл. называется журнал
. В последнем случае if создает именованный канал
и запускает процесс tee
для копирования всего, что записано в именованный канал, в выходные данные сценария demo
(так какая-то другая прога
получит) и в файл с именем log
. Затем он организует отправку вывода остальной части файла в этот именованный канал. Он также устанавливает, что когда демо
завершается, он удаляет именованный канал.
Строка exec 1> & -
не нужна.
Конечным результатом всего этого является то, что слово «до свидания» записывается в файл «журнал». Если вы запустили демо | cat
вы увидите на экране как «привет», так и «до свидания».
Как отмечает @derobert в комментариях, именованный канал имеет предсказуемое имя. В зависимости от настройки umask
это может позволить кому-то испортить вывод демо
, либо прочитав его (так что tee
не увидит его), либо добавив дополнительные материал для тройник
для копирования. Это дополнение к ряду стандартных атак, которые можно использовать против известных или предсказуемых имен. Программные или жесткие ссылки можно настроить заранее, чтобы другие файлы открывались или усекались. В моей системе Linux mknod завершится ошибкой, если файл уже существует, но поскольку сценарий игнорирует эту ошибку, будет выполнено exec 1> $ npipe
.