Из этого поста командной строки :
$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)
Похоже на несколько стандартных вводов, но - если я правильно помню свой курс по программированию Linux - это не может быть. Я думал, что по определению стандартный ввод был одним потоком.
Возможно это имеет отношение к stdin? Может кто-то объяснить это мне; возможно, предоставьте ссылки на документацию.
Бонус: как скрипт будет обрабатывать эти несколько потоков? Если бы кто-то мог привести пример Python или Perl, это было бы очень полезно.
<(…)
; В Zsh синтаксис подстановки процесса есть=(…)
.Ответы:
Это не множественный стандартный ввод. Это bash'ism, который называется «Замена процесса» http://tldp.org/LDP/abs/html/process-sub.html
Создает псевдофайл (
/dev/fd/something
) для каждой замены. Это довольно полезно. Команду можно читать только как поток, то есть она не может идти вперед и назад с помощью fseek. Нужно читать это как поток байтов, как канал.БОНУС Ответ
Вам не нужно делать слишком много, чтобы использовать это. Что касается вашего сценария, он получает действительное имя файла в командной строке, которое может быть открыто () как любой другой. Как уже говорили другие, вы увидите
diff /dev/fd/XX /dev/fd/YY
. Если вы выполните stat () для любого из этих псевдофайлов, вы увидите, что это именованный канал, и вам следует использовать семантику канала, а именно: fseek () или ftell (). Если вы делаете тест стат () явно увидеть , если это файл (например[ -f $1 ]
) , это будет перерыв - это реализуется в виде именованного канала в конце концов.источник
<(...)
делает процесс подстановки в bash. Выходные данные процесса в скобках отправляются в дополнительный дескриптор файла, выходящий за пределы нормального значения 3, и возвращается имя файла, соответствующее этому дескриптору файла. Таким образом, вывод команды может быть обработан как имя файла для передачи другой команде.источник
Существует один
stdin
и одинstdout
для каждого процесса . Обычно они подключены к терминалу, но их можно перенаправить отдельно друг от друга.В этом примере
wget
задействованы два процесса, каждый из которых получает свой собственныйstdin
иstdout
. Каждыйwget
процесс пишет-
, что егоstdout
. Затемbash
подстановка процесса<(...)
соединяетstdout
процесс с уникальным псевдофайлом, из которогоdiff
можно читать. Обратите внимание, что две замены процесса дают два разных псевдофайла! Таким образом,diff
видит что-то вроде:где
stdout
изwget -q -O - URL1
подключен/dev/fd/XX
, иstdout
изwget -q -O - URL2
к/dev/fd/YY
.источник