Несколько стандартный вход? Как?

Из этого сообщения commandlinefu:

$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)

Походит на несколько стандартных исходных данных, но---, если я помню свой курс Porgramming Linux правильно---это, не может быть им. Я думал, что по определению стандартный вход был одним потоком.

Возможно, это имеет отношение ни к чему stdin? Может кто-то объяснять это мне; возможно, предоставьте ссылки на документацию.

Премия: Как сценарий обработал бы эти несколько потоков? Если бы кто-то мог бы предоставить Python или пример Perl, который был бы очень полезен.

36
задан 21.10.2010, 01:53

2 ответа

Это не несколько стандартный вход. Это - bash'ism, который назвал 'Замену Процесса' http://tldp.org/LDP/abs/html/process-sub.html

Это создает псевдо файл (/dev/fd/something) для каждой замены. Это довольно полезно. Команда может только читать как поток, означая, что она не может пойти назад и вперед с fseek. Это должно считать его как поток байтов, как канал.

БОНУСНЫЙ ответ

Вы не должны делать слишком много для использования этого. Что касается Вашего сценария, это получает допустимое имя файла на командной строке, которая может быть открыта () редактор как что-либо еще. Как другие сказали, Вы видели бы diff /dev/fd/XX /dev/fd/YY. Если Вы сделаете статистику () на каком-либо из этих псевдофайлов, то Вы будете видеть, что это - именованный канал, и необходимо рассматривать его с семантикой канала - а именно, никакой fseek () или ftell (). Если Вы делаете статистика () тестирует, чтобы явно видеть, является ли это файл (например. [ -f $1 ]) это повредится - это реализовано как именованный канал, в конце концов.

27
ответ дан 07.12.2019, 08:58

<(...) действительно обрабатывает замену в ударе. Вывод процесса в parens отправляется в дополнительный дескриптор файла вне нормальных 3, и имя файла возвращается, соответствуя тому дескриптору файла. Таким образом вывод команды можно рассматривать как имя файла, которое будет передано другой команде.

7
ответ дан 07.12.2019, 08:58

Теги

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