Питання в поточному повідомленні про виграш:
загальний приклад занадто складний. Чи можете мені хтось пояснити, як реалізувати наступний приклад?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
і, таким чином, стає доступною для всього, що знаходиться в складеній команді як /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 та його підкаталах та файлах .