Перенаправление двух файлов на стандартный ввод - PullRequest
14 голосов
/ 19 января 2011

Существует несколько команд Unix, которые предназначены для работы с двумя файлами. Обычно такие команды позволяют читать содержимое одного из «файлов» из стандартного ввода, используя одну черту вместо имени файла.

Я только что натолкнулся на метод , который, кажется, позволяет читать оба файла из стандартного ввода:

comm -12 <(sort file1) <(sort file2)

Моей первоначальной реакцией на недоверие было: «Это не должно работать. При стандартном вводе будут просто объединяться оба файла. Команда не сможет отличить файлы или даже понять, что они получили содержимое два файла. "

Конечно, эта конструкция работает. Я протестировал его с comm и diff, используя bash 3.2.51 на cygwin 1.7.7. Мне интересно, как и почему это работает:

  • Почему это работает?
  • Это расширение Bash, или это просто функциональность оболочки Bourne?
  • Это работает в моей системе, но будет ли этот метод работать на других платформах? (Другими словами, будут ли сценарии, написанные с использованием этой техники, переносимы?)

Ответы [ 2 ]

10 голосов
/ 19 января 2011

Bash, оболочка Korn (в любом случае ksh93) и оболочка Z поддерживают процесс замены .Они появляются как файлы для утилиты.Попробуйте это:

$ bash -c 'echo <(echo)'
/dev/fd/63
$ ksh -c 'echo <(echo)'
/dev/fd/4
$ zsh -c 'echo <(echo)'
/proc/self/fd/12

Вы увидите файловые дескрипторы, похожие на показанные.

6 голосов
/ 19 января 2011

Это стандартное расширение Bash.<(sort file1) открывает канал с выводом команды sort file1, дает каналу временное имя файла и передает это временное имя файла в командной строке comm.

Вы можете увидеть, как это работаетполучив echo, чтобы сказать вам, что передается в программу:

echo <(sort file1) <(sort file2)
...