Какие fd используются при выполнении diff <(cat old) <(cat new)?

Если я сделаю:

diff <(cat old) <(cat new) 

Hoe делает работу внутри программы diff? И как я делаю тот же трюк с сценарием bash?

Вы можете попробовать сами:

 echo <(echo) <(echo) 

Diff просто читает оба файла.

Если вы хотите использовать <(...) в качестве параметра для вашего сценария bash, просто имейте в виду, что вы не можете «перемотать» файл (или снова открыть). Поэтому, прочитав это, он исчез. Вы можете использовать read для обработки строки за строкой, вы можете использовать grep или что угодно. Если вам нужно обработать его более одного раза, сохраните его содержимое в переменной

 input=$(cat "$1"; printf x) # The "x" keeps the trailing empty lines. input=${input%x} 

или скопировать его во временный файл и прочитать его снова и снова:

 tmp=$(mktemp) cat "$1" > "$tmp" 

Для программы diff нет разницы, как если бы вы diff old new . Оператор <(cmd) перенаправляет stdout из cmd1 в fifo, а затем передает fifo в качестве аргумента diff .

См. Пример:

 user@host:~$ echo <(ls) /dev/fd/63 

/dev/fd/63 – это fifo, содержащий вывод ls , см. cat <(ls) печатает вывод fifo, следовательно, вывод ls .

Таким образом, программа diff выполняется как что-то вроде этого:

 diff /dev/fd/63 /dev/fd/64 

И оба фиоса содержат вывод cmds. Для diff они – файлы.