Скажем, у меня есть программы a
и b
, которые можно запускать с помощью ./a
и ./b
.
Можно ли различать свои выходы без предварительной записи во временные файлы?
Скажем, у меня есть программы a
и b
, которые можно запускать с помощью ./a
и ./b
.
Можно ли различать свои выходы без предварительной записи во временные файлы?
Используйте <(command)
, чтобы передать один вывод команды в другую программу, как если бы это было имя файла. Bash выводит вывод программы в канал и передает внешнюю команду имя файла, например /dev/fd/63
.
diff <(./a) <(./b)
Аналогичным образом вы можете использовать >(command)
, если хотите передать что-то в команду.
Это называется "Замена процесса" на странице Bash man.
Добавляя оба ответа, если вы хотите увидеть сравнение бок о бок, используйте vimdiff
:
vimdiff <(./a) <(./b)
Что-то вроде этого:
Один из вариантов заключается в использовании именованных каналов (FIFO):
mkfifo a_fifo b_fifo
./a > a_fifo &
./b > b_fifo &
diff a_fifo b_fifo
... но решение Джона Кугельмана намного чище.
Любому любопытно, как вы выполняете замещение процесса при использовании Fish shell:
Bash:
diff <(./a) <(./b)
Рыба:
diff (./a | psub) (./b | 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 перед этим
2 > & 1 означает отправку выходного файла file_descriptor 2 (STD_ERR) в то же место, что и выход file_descriptor 1 (STD_OUT)
Надеюсь, что это было полезно.