Отличный вывод из двух программ без временных файлов - PullRequest
139 голосов
/ 27 сентября 2010

Скажем, у меня тоже есть программы a и b, которые я могу запустить с ./a и ./b.

Можно ли выводить их результаты без предварительной записи во временные файлы?

Ответы [ 6 ]

202 голосов
/ 27 сентября 2010

Используйте <(command) для передачи вывода одной команды другой программе, как если бы это было имя файла. Bash направляет вывод программы в канал и передает имя файла, например /dev/fd/63, внешней команде.

diff <(./a) <(./b)

Точно так же вы можете использовать >(command), если хотите передать что-то в команду.

На справочной странице Bash это называется «Подстановка процесса».

25 голосов
/ 26 марта 2014

Добавляя к обоим ответам, если вы хотите увидеть параллельное сравнение, используйте vimdiff:

vimdiff <(./a) <(./b)

Примерно так:

enter image description here

20 голосов
/ 27 сентября 2010

Один из вариантов - использовать именованные каналы (FIFO) :

mkfifo a_fifo b_fifo
./a > a_fifo &
./b > b_fifo &
diff a_fifo b_fifo

... но Решение Джона Кугельмана намного чище.

14 голосов
/ 21 января 2016

Для любого любопытного, вот как вы выполняете процесс подстановки при использовании Fish shell :

Bash:

diff <(./a) <(./b)

Рыба:

diff (./a | psub) (./b | psub)

К сожалению, реализация в рыбе в настоящее время недостаточна ;рыба будет зависать или использовать временный файл на диске.Вы также не можете использовать psub для вывода из вашей команды.

7 голосов
/ 27 апреля 2015

Добавление еще немного к и без того хорошим ответам (помогло мне!):

Команда docker выводит свою справку в STD_ERR (т. Е. Файловый дескриптор 2)

Я хотелчтобы увидеть, дали ли docker attach и docker attach --help одинаковый вывод

$ docker attach

$ docker attach --help

Просто набрав эти две команды, я сделал следующее:

$ diff <(!-2 2>&1) <(!! 2>&1)

!!то же самое, что! -1, что означает выполнение команды 1 перед этой - последняя команда

! - 2 означает выполнение команды 2 перед этой

2> & 1 означает отправку file_descriptor 2вывод (STD_ERR) в то же место, что и выход file_descriptor 1 (STD_OUT)

Надеюсь, что это было полезно.

0 голосов
/ 29 июня 2018

Для zsh, использование =(command) автоматически создает временный файл и заменяет =(command) на путь самого файла. При обычном замещении процесса $(command) заменяется на вывод команды.

Эта функция zsh очень полезна и может использоваться для сравнения результатов двух команд с использованием инструмента сравнения, например Beyond Compare:

bcomp  =(ulimit -Sa | sort) =(ulimit -Ha | sort)

Для Beyond Compare обратите внимание, что вы должны использовать bcomp для вышеупомянутого (вместо bcompare), так как bcomp запускает сравнение и ожидает для его завершения. Если вы используете bcompare, это запускает сравнение и сразу же завершается, из-за чего исчезают временные файлы, созданные для хранения вывода команд.

Подробнее здесь: http://zsh.sourceforge.net/Intro/intro_7.html

Также обратите внимание:

Обратите внимание, что оболочка создает временный файл и удаляет его после завершения команды.

и следующее, в чем разница между $(...) и =(...):

Если вы прочитаете справочную страницу zsh, вы можете заметить, что <(...) - это другая форма подстановки процесса, которая похожа на = (...). Между ними есть важное различие. В случае <(...) оболочка создает именованный канал (FIFO) вместо файла. Это лучше, так как не заполняет файловую систему; но это не работает во всех случаях. Фактически, если бы мы заменили = (...) на <(...) в приведенных выше примерах, все они перестали бы работать, кроме fgrep -f <(...). Вы не можете редактировать канал или открывать его как почтовую папку; Однако у fgrep нет проблем с чтением списка слов из канала. Вы можете задаться вопросом, почему не работает diff <(foo), так как foo | diff - барные работы; это связано с тем, что diff создает временный файл, если он замечает, что одним из его аргументов является -, а затем копирует свой стандартный ввод во временный файл. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...