Меня немного смущает следующий синтаксис. Хотя это работает, он не понимает, почему это работает. Кажется, что к команде diff прикреплены две трубы. Но разве не один STDIN
?
Примеры:
diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)
bash
странице руководства .Ответы:
Каналы просто связаны с дескрипторами файлов, отличными от 0 (stdin):
Конечно, процесс может иметь более одного дескриптора открытого файла одновременно, поэтому проблем нет.
источник
pipe()
системным вызовом.pipe()
и затем разветвляет подпроцессы. Основной процесс делает иметь дополнительные дескрипторы открыть , если используются анонимная труба. Эти дополнительные файловые дескрипторы передаются в форме/dev/fd/...
, и процесс обычно просто открывает их, используя эти имена файлов. Это приведет к ихdup()
редактированию, создавая еще больше открытых файловых дескрипторов. Процесс также может сразу использовать именованный дескриптор файла без каких-либо открытых вызовов ...a
, я назвал его как./a <(ls)
, и он успешно распечатал список файлов, доказав, что названный файловый дескриптор (63 в моем случае) уже был открыт. Bash может использовать именованные каналы во временном каталоге на архитектурах, отличных от Linux, и в этом случае никакие дополнительные файловые дескрипторы не будут открываться при входе в основной процесс.