Дві труби в одну команду


9

Мене трохи бентежить наступний синтаксис. Хоча це працює, воно не розуміє, чому це працює. Здається, наче дві команди приєднані до команди diff. Але хіба немає лише одного STDIN?

Приклади:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)

Ось посилання на відповідну тему - заміна процесу - на довідковій bashсторінці.
чепнер

Відповіді:


13

Труби просто пов'язані з іншими дескрипторами файлів, ніж 0 (stdin):

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

Звичайно, процес може мати декілька відкритих дескрипторів файлів одночасно, тому проблем немає.


Якби я тільки знав його звані тимчасові труби, я міг би його гугл. Дякую!

@iblue: Я не думаю, що це називається "тимчасові труби". Це просто труби, як створено pipe()системним викликом.
Свен Марнах

Якщо бути дуже точним, його можна назвати "анонімними іменованими трубами", але достатньо, щоб погуглити його.

2
@WilliamPursell: Файлів немає. Оболонка створює анонімну трубку, використовуючи, pipe()а потім розщеплює підпроцеси. Основний процес містить додаткові дескриптори файлів, якщо використовується анонімна труба. Ці додаткові дескриптори файлів передаються у формі /dev/fd/..., і процес зазвичай просто відкриває їх за допомогою цих імен файлів. Це призведе до їх dup()редагування, створивши ще більш відкриті дескриптори файлів. Процес також може відразу ж використати названий дескриптор файлу без відкритих дзвінків ...
Sven Marnach

1
... як показано в цій невеликій і дурній тестовій програмі . Після компіляції aя назвав це так ./a <(ls), і він успішно надрукував список файлів, довівши, що названий декриптор файлу (63 у моєму випадку) вже відкритий. Баш може використовувати названі канали у тимчасовому каталозі для різних архітектур, ніж Linux, і в цьому випадку ніяких додаткових дескрипторів файлів не буде відкрито при вході в основний процес.
Свен Марнах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.