Как конвейер узнает, когда остановиться [дублировать]

/ root - это просто домашний каталог пользователя root.

Обычно / root - это довольно "неинтересный" каталог, используемый только при интерактивном входе в систему как root. Если вы не помните, что вы вручную редактировали или создавали там интересные файлы, я бы вообще не синхронизировал это.

С другой стороны, монтирование привязки / root не должно вызывать никаких проблем. Возможно, есть некоторые (автоматически сгенерированные) файлы конфигурации, которые удобно синхронизировать, например .ssh / known_hosts или .ssh / authorized_keys.

Если вы сомневаетесь, см.

diff -rq /path/to/old/root /root

, если вы видите что-то, что вы хотите сохранить от старой установки.

15
08.03.2016, 11:22
1 ответ

Команды связаны с конвейером (здесь я говорю о системном примитиве - очевидно, они связаны с | ). Когда конец канала для чтения ( stdin из head ) становится close d (== когда head либо явно ( ] close ) или неявно (exit) закрывает его), попытки записи в конец записи ( stdout of yes ) завершатся ошибкой.

По умолчанию это не просто обычная ошибка errno , а сбой, в результате которого процесс записи получает сигнал SIGPIPE .По умолчанию обработчик сигнала SIGPIPE завершает работу.

Короче говоря, если вы напишете на сломанный канал, система отправит вам SIGPIPE и по умолчанию SIGPIPE убьет вас. Вот почему да завершается, когда голова заканчивается (и тем самым разрывает трубу).


Если вы проигнорируете SIGPIPE в родительской оболочке, то команды унаследуют это расположение, и запись в сломанный канал просто вызовет ошибку errno . из EPIPE . Как оказалось, да преобразовывает эту ошибку в строку и печатает ее:

$ (trap "" SIGPIPE; yes | head -n 5)  
y
y
y
y
yes: standard output: Broken pipe
yes: write error
24
27.01.2020, 19:50

Теги

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