Вопрос в текущем уведомлении о вознаграждении:
общий пример слишком сложен. Может кто-нибудь объяснить, как реализовать следующий пример?diff <(cat "$2" | xz -d) <(cat "$1" | xz -d)
кажется, здесь есть ответ .
Как показано в ответе Жиля , общая идея состоит в том, чтобы отправлять выходные данные команд «продюсера» в файлы 1 новых устройств на разных этапах конвейера, делая их доступными для команд «потребителя», которые могут принимать имена файлов в качестве аргументов ( при условии, что ваша система дает вам доступ к файловым дескрипторам как /dev/fd/X
).
Самый простой способ достичь того, что вы ищете, это:
xz -cd file1.xz | { xz -cd file2.xz | diff /dev/fd/3 -; } 3<&0
(Использование file1.xz
вместо "$1"
удобочитаемости, а xz -cd
не cat ... | xz -d
потому, что достаточно одной команды).
Выход первой команды «продюсер» xz -cd file1.xz
передается в составную команду ( {...}
); но вместо немедленного использования в качестве стандартного ввода следующей команды, он дублируется в дескрипторе файла 3
и, таким образом, становится доступным для всего внутри составной команды as /dev/fd/3
. Выходные данные второй команды «продюсер» xz -cd file2.xz
, которая не использует ни своего стандартного ввода, ни чего-либо из файлового дескриптора 3
, затем передаются в команду «потребителя» diff
, которая считывает из своего стандартного ввода и из /dev/fd/3
.
Может быть добавлено дублирование трубопровода и дескриптора файла, чтобы обеспечить файлы устройства для стольких команд «производителя», сколько необходимо, например:
xz -cd file1.xz | { xz -cd file2.xz | { diff /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
Хотя это может быть неуместно в контексте вашего конкретного вопроса, стоит отметить, что:
cmd1 <(cmd2) <(cmd3)
, cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
И ( cmd2 | ( cmd3 | ( cmd1 /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )
имеют различные потенциальные эффекты на начальной среде выполнения.
Вопреки тому, что происходит в cmd1 <(cmd2) <(cmd3)
, cmd3
и cmd1
в cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
не сможет прочитать какие-либо входные данные от пользователя. Это потребует дополнительных файловых дескрипторов. Например, чтобы соответствовать
diff <(echo foo) <(read var; echo "$var")
вам понадобится что-то вроде
{ echo foo | { read var 0<&9; echo "$var" | diff /dev/fd/3 -; } 3<&0; } 9<&0
1 Более подробную информацию о них можно найти в U & L, например, в Understanding / dev и его подкаталогах и файлах .