Я предполагал, что самый простой способ сравнить содержимое двух одинаковых каталогов будет что-то вроде
diff `ls old` `ls new`
Но я понимаю, почему это не работает; diff
передается большой длинный список файлов в командной строке, а не два потока, как я надеялся. Как передать два выхода в diff напрямую?
command-line
diff
троичный
источник
источник
Ответы:
Подстановка команд подставляет
`…`
выходные данные команды в командную строку, поэтомуdiff
список файлов в обоих каталогах рассматривается как аргументы. Вам нужноdiff
видеть два имени файла в его командной строке, и содержимое этих файлов должно быть списком каталогов. Вот что делает процесс подстановки .Аргументы для
diff
будут выглядеть/dev/fd/3
и/dev/fd/4
: они дескрипторы , соответствующие двух труб , созданных Баш. Когдаdiff
эти файлы откроются, они будут подключены к стороне чтения каждого канала. Сторона записи каждого канала связана сls
командой.источник
echo <(echo) <(echo)
никогда не думал, что это может быть так интересно: Dls
том, что он искажает имена файлов. Анализ выходных данных хрупок (он не работает с «странными» именами файлов). Для сравнения двух списков каталогов это нормально, пока вывод однозначен. Для произвольных имен файлов это потребует такой опции, как--quoting-style=escape
.<(…)
создает трубу. Кажется, что смесь не работает с трубами, поэтому вы не можете использовать<(…)
. В zsh вы можете заменить<(…)
на,=(…)
и это будет работать, потому=(…)
что промежуточные выходные данные помещаются во временный файл. В bash я не думаю, что есть какой-то удобный синтаксис, вам придется самостоятельно управлять временными файлами.Для zsh использование
=(command)
автоматически создает временный файл и заменяет=(command)
путь к самому файлу. С Подстановкой Команды,$(command)
заменяется выходом команды.Итак, есть три варианта:
$(...)
<(...)
=(...)
Подстановка процессов с добавлением zsh, # 3, очень полезна и может использоваться для сравнения выходных данных двух команд с использованием инструмента сравнения, например Beyond Compare:
Для Beyond Compare обратите внимание, что вы должны использовать
bcomp
вышеперечисленное (вместоbcompare
), посколькуbcomp
запускает сравнение и ожидает его завершения. Если вы используетеbcompare
, это запускает сравнение и сразу же завершается, из-за чего временные файлы, созданные для хранения вывода команд, исчезают.Подробнее читайте здесь: http://zsh.sourceforge.net/Intro/intro_7.html
Также обратите внимание на это:
и следующее, которое является разницей между двумя типами замещения Process, поддерживаемыми zsh (то есть # 2 и # 3):
Ссылка: https://unix.stackexchange.com/questions/393349/difference-between-subshells-and-process-substitution
источник
$(...)
это не подстановка процессов, это подстановка команд .<(...)
это процесс замещения. Вот почему цитируемый отрывок вообще не упоминается$(...)
.Рыбная раковина
В оболочке Рыба вы должны трубкой в псуб . Вот пример сравнения конфигурации heroku и dokku с Beyond Compare :
источник
meld
открытым исходным кодом доступен в репозиториях Ubuntu и EPEL. meldmerge.orgЯ часто использую технику, описанную в принятом ответе:
но я нахожу, что обычно использую его с гораздо более сложными командами, чем в примере выше. В таких случаях создание команды diff может раздражать. Я придумал некоторые решения, которые другие могут найти полезными.
Я считаю, что в 99% случаев я пробую соответствующие команды перед запуском diff. Следовательно, команды, которые я хочу использовать, прямо в моей истории ... почему бы не использовать их?
Я использую встроенную команду Fix Command (fc) bash для выполнения двух последних команд:
Флаги ФК:
-1
-1
относятся к начальному и конечному полаганию в истории, в этом случае его от последней команды до последней команды , которая дает только последнюю команду.Наконец, мы завернем это,
$()
чтобы выполнить команду в подоболочке.Очевидно, что набирать текст немного неудобно, поэтому мы можем создать псевдоним:
Или мы можем создать функцию:
который поддерживает указание линий истории для использования. После использования обоих я считаю, что псевдоним - это версия, которую я предпочитаю.
источник