Идиома >(...)
просто означает (в терминах непрофессионала): "имя файла".
И это работает как "имя файла" (вроде как, все станет ясно через мгновение):
$ echo <(date)
/proc/self/fd/11
Или какое-то другое число/имя в вашей ОС. Но echo действительно выводит имя, точно так же, как если бы вы сделали:
$ echo ProcSubs11
ProcSubs11
И если файл с меткой ProcSubs11 существует, вы могли бы также сделать:
$ cat ProcSubs11
contents_of_file_ProcSubs11
Что вы могли бы сделать точно так же с:
$ cat <(date)
Fri Jan 15 21:25:18 UTC 2016
Разница в том, что фактическое имя "Process Substitution" "не видно" и что детали намного длиннее, чем чтение простого файла, как описано довольно хорошо во всех болезненных подробностях в ссылке на Как подмена процессов реализована в bash?.
Сказав все вышесказанное, давайте рассмотрим ваши вопросы.
... кажется, что с операционной точки зрения он ничем не отличается от простой безымянной трубы...
Ну, "Подмена процессов" как раз и основана на неименованной трубе
, как сказано в вашей первой ссылке:
- Процесс bash создает неименованную трубу для связи между двумя процессами, созданными позже.
Разница в том, что все ~6 шагов, описанных в ссылке, упрощены до одной идиомы >(...)
для записи в и для чтения из.
И можно утверждать, что у соединения (трубы) есть имя, как и у файла. Просто это имя скрыто от пользователя (/proc/self/fd/11
, показанное в начале).
1) Я добавляю трубу и перенаправление вывода shasum ...
$ cat file_{1,2,3} | tee file_4 | shasum -a 256 > file_4.sha256
Там нет "подстановки процесса", но стоит отметить (для дальнейшего), что tee
посылает (пишет) то, что получает в свой stdin
в файл file_4
и также посылает то же самое stdin
содержимое в stdout
. Который, как оказалось, подключен к трубе (в данном случае), которая пишет в shasum.
Короче говоря, говоря простым языком, tee копирует stdin
в file_4
и shasum
.
2) Я пробую то же самое с ProcSub:
$ cat file_{1,2,3} | tee file_4 >(shasum -a 256 > file_4.sha256)
Повторное использование описания выше (в простых терминах) для описания этого примера:
Tee копирует stdin
в три элемента: file_4
, shasum
и stdout
.
Почему? Помните, что >(...)
- это имя файла, подставим его в строку:
$ cat file_{1,2,3} | tee file_4 /proc/self/fd/11
tee служит входом для двух файлов file_4
и shasum
(через "Process Substitution"), а stdout
из tee
по-прежнему подключен к своему месту по умолчанию: консоли. Вот почему вы видите цифры в консоли.
Чтобы сделать этот пример точно равным 1), мы могли бы сделать:
$ cat file_{1,2,3} | tee file_4 > /proc/self/fd/11 ### note the added `>`
Что становится (да, пробел между >
и >(
должен быть использован.
$ cat file_{1,2,3} | tee file_4 > >(shasum -a 256 > file_4.sha256)
Что перенаправляет stdout tee
в "Подстановку процесса".
Q: Итак, общий вопрос: как обрабатываются i/o для трех случаев, описанных выше
Я полагаю, что только что объяснил три случая, если не ясно, пожалуйста, прокомментируйте.
почему конструкция
Потому что (говоря простым языком) вы не можете вставить мужской штырь в мужское гнездо.
Конструкция stdin внешней команды. Внешняя команда tee
пытается подключить stdout
(как) элементы. Поэтому эта пара не может совпасть.
Важное замечание:
Команда cat
скрывает некоторые детали при применении к "Process Substitution", так как обе эти команды дадут одинаковый вывод:
$ cat <(date)
$ cat < <(date)
Все правильно, но делать выводы из вводящего в заблуждение равенства - неправильно.
Если вы не можете прервать «непрерывное чтение» и это не связано с выключенным сервером NFS, вы обнаружили ошибку драйвера.
Время ожидания ввода-вывода в локальное фоновое хранилище не должно превышать 5 -10 минут. Поэтому, если вы набираете ^C
или ^Z
и ничего не происходит в течение 10 минут, это ошибка драйвера.
Предыстория заключается в том, что UNIX определяет, что так называемый fast IO
не может быть прерван сигналами, поскольку быстрый ввод-вывод завершится через обозримое время.
Прерывание операций ввода-вывода по сигналам приводит к большим накладным расходам, поскольку необходимо вернуться в чистое состояние. Все, что произошло после старта в ИО, нужно раскрутить и возврат может произойти только оттуда, откуда был инициирован ИО.
Хуже того, если драйвер фонового хранилища реализует прерываемый ввод-вывод, это вызовет неустранимые проблемы в файловых системах выше такого драйвера. Вы используете драйвер, предназначенный для использования в качестве фонового хранилища для файловой системы...
Вы можете позвонить dmesg
и проверить сообщения ядра о вашей проблеме. Если прерывание действительно не работает через 10 минут (, когда ожидается, что один системный вызов чтения или записи истечет по тайм-ауту, и есть шанс убить dd
между двумя такими системными вызовами ), вам необходимо перезагрузиться.
Если это устройство подключено к USB, вы можете попытаться извлечь устройство перед перезагрузкой.