Відповіді:
Використовуйте <(command)
для передачі виводу однієї команди іншій програмі так, ніби це ім'я файлу. Bash передає вихід програми в трубу і передає ім'я файлу, як /dev/fd/63
у зовнішню команду.
diff <(./a) <(./b)
Аналогічно ви можете використовувати, >(command)
якщо хочете щось передавати в команду.
Це називається "Заміна процесу" на сторінці "Баш".
-bash: syntax error near unexpected token ('
. Я спробував знову без дужок і дістався -bash: java: No such file or directory
. Це не працює, якщо команда має параметри?
alias diffcmd bash -c \'diff \<\(sh -c \!:1\) \<\( sh -c \!:2 \)\'
. (Тоді для прикладу: diffcmd "ls" "ls -a").
fseek
, zsh пропонує те, =(./a)
що можна використовувати ідентично, <(./a)
але використовує тимчасовий файл під кришкою, який zsh видалить для вас.)
Додавши до обох відповідей, якщо ви хочете бачити порівняння, використовуйте vimdiff
:
vimdiff <(./a) <(./b)
Щось на зразок цього:
vimdiff
створює красиві, розумні та інтерактивні погляди на порівняння різниць. Схоже, він постачається з vim
пакетом для більшості систем.
vimdiff
також показано не тільки рядок, який відрізняється, але й конкретний текстовий фрагмент, який відрізняється.
Одним із варіантів буде використання названих труб (FIFO) :
mkfifo a_fifo b_fifo
./a > a_fifo &
./b > b_fifo &
diff a_fifo b_fifo
... але рішення Джона Кугельмана набагато чистіше.
rm a_fifo b_fifo
.
Для будь-кого, хто цікавиться, ось як ви виконуєте підстановку процесу за допомогою оболонки Fish :
Bash:
diff <(./a) <(./b)
Риба:
diff (./a | psub) (./b | psub)
На жаль, реалізація риби в даний час є недостатньою ; риба буде або висіти, або використовувати тимчасовий файл на диску. Ви також не можете використовувати psub для виведення з вашої команди.
Додамо трохи більше до вже хороших відповідей (допомогли мені!):
Команда docker
видає свою допомогу STD_ERR
(тобто дескриптор файлу 2)
Я хотів би бачити , якщо docker attach
і docker attach --help
дав той же результат
$ docker attach
$ docker attach --help
Щойно набравши ці дві команди, я зробив наступне:
$ diff <(!-2 2>&1) <(!! 2>&1)
!! - це те саме, що! -1, що означає виконати команду 1 перед цією - останньою командою
! -2 означає запустити команду дві перед цією
2> & 1 означає надіслати файл file_descriptor 2 (STD_ERR) на те саме місце, що і файл file_descriptor 1 (STD_OUT)
Сподіваюся, що це принесло користь.
Для zsh, використання =(command)
автоматично створює тимчасовий файл і замінює =(command)
шлях до самого файлу. При звичайній Процес заміщення $(command)
замінюється результатом команди.
Ця функція zsh дуже корисна і може бути використана так, щоб порівняти вихід двох команд за допомогою інструмента "diff", наприклад Beyond Порівняти:
bcomp =(ulimit -Sa | sort) =(ulimit -Ha | sort)
Для "Більше порівняння" зауважте, що ви повинні використовувати bcomp
для вищезазначеного (замість bcompare
), оскільки bcomp
запускає порівняння і чекає його завершення. Якщо ви використовуєте bcompare
, це запускає порівняння і негайно виходить із-за чого тимчасові файли, створені для зберігання виводу команд, зникають.
Детальніше читайте тут: http://zsh.sourceforge.net/Intro/intro_7.html
Також зауважте це:
Зауважте, що оболонка створює тимчасовий файл і видаляє його, коли команда закінчена.
і наступне, що є різницею між $(...)
та =(...)
:
Якщо ви читаєте чоловічу сторінку zsh, ви можете помітити, що <(...) - це ще одна форма заміни процесу, яка схожа на = (...). Існує важлива різниця між ними. У випадку <(...) оболонка створює названу трубу (FIFO) замість файлу. Це краще, оскільки воно не заповнює файлову систему; але це працює не у всіх випадках. Насправді, якби ми замінили = (...) на <(...) у наведених вище прикладах, усі вони перестали б працювати, за винятком fgrep -f <(...). Ви не можете редагувати трубу або відкривати її як поштову папку; fgrep, однак, не має проблем із читанням списку слів із труби. Вам може бути цікаво, чому смуга diff <(foo) не працює, оскільки foo | різні роботи; це тому, що diff створює тимчасовий файл, якщо він помічає, що одним з його аргументів є -, а потім копіює його стандартний вхід у тимчасовий файл.