Кілька стандартних входів? Як?


36

З цього командного рядка :

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

Схоже, кілька стандартних входів, але --- якщо я добре запам'ятав свій курс Porgramming Linux --- це не може бути. Я думав, що за визначенням стандартний вхід - це один потік.

Можливо, це має відношення до stdin? Може хтось мені це пояснить; можливо, надайте посилання на документацію.

Бонус: Як би сценарій обробляв ці кілька потоків? Якщо хтось може надати приклад Python або Perl, це було б дуже корисно.


1
Гарне питання. Якщо ви не знаєте, є веб-сайт для запитів і
Метт Еллен

2
Документація для заміни процесів: gnu.org/software/bash/manual/bashref.html#Process-Substitution
glenn jackman

Примітка: у Bash це <(…); в синтаксисі заміщення процесу Zsh є =(…).
Каміль Маціоровський

Відповіді:


27

Це не декілька стандартних даних. Це башізм, який називається "Заміна заміни" 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 - wiki.bash-hackers.org/syntax/expansion/proc_subst
studgeek

І що рекомендується використовувати цю функцію? Підтримуйте його, коли ваша програма може розумно працювати з потоком, а не вимагати файл з випадковим доступом?
masterxilo

7

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


7

Для кожного процесу є один stdinі один . Зазвичай вони підключаються до терміналу, але їх можна перенаправляти окремо один від одного.stdout

У прикладі wgetзадіяні два процеси, кожен з яких отримує свій власний stdinі stdout. Кожен wgetпроцес пише в те -, що є його stdout. Потім bashзаміна процесу <(...)підключає stdoutпроцес до унікального псевдофайлу, з якого diffможна читати. Зауважте, що дві заміни процесу дають два різних псевдофайли! Таким чином, diffбачить щось на кшталт:

diff /dev/fd/XX /dev/fd/YY

де stdoutз wget -q -O - URL1є з'єднаний /dev/fd/XX, а stdoutз wget -q -O - URL2до /dev/fd/YY.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.