Pertanyaan dalam pemberitahuan karunia saat ini:
contoh umum terlalu rumit. Adakah yang bisa menjelaskan bagaimana menerapkan contoh berikut?diff <(cat "$2" | xz -d) <(cat "$1" | xz -d)
sepertinya punya jawaban di sini .
Seperti yang ditunjukkan dalam jawaban Gilles , ide umumnya adalah untuk mengirim output dari perintah "produser" ke file perangkat baru 1 pada berbagai tahapan pipa, menjadikannya tersedia untuk perintah "konsumen", yang mungkin dapat menggunakan nama file sebagai argumen ( dengan asumsi bahwa sistem Anda memberi Anda akses ke deskriptor file sebagai /dev/fd/X
).
Cara paling sederhana untuk mencapai apa yang Anda cari mungkin adalah:
xz -cd file1.xz | { xz -cd file2.xz | diff /dev/fd/3 -; } 3<&0
(Menggunakan file1.xz
di tempat "$1"
untuk keterbacaan dan xz -cd
bukan cat ... | xz -d
karena satu perintah sudah cukup).
Output dari perintah "produser" pertama xz -cd file1.xz
,, disalurkan ke perintah gabungan ( {...}
); tetapi, alih-alih dikonsumsi langsung sebagai input standar dari perintah berikutnya, itu digandakan ke file deskriptor 3
dan dengan demikian dapat diakses oleh semua yang ada di dalam perintah gabungan sebagai /dev/fd/3
. Output dari perintah "produser" kedua xz -cd file2.xz
, yang tidak mengkonsumsi input standar atau apapun dari deskriptor file 3
, kemudian disalurkan ke perintah "konsumen" diff
, yang membaca dari input standar dan dari /dev/fd/3
.
Duplikasi pemipaan dan deskriptor file dapat ditambahkan untuk menyediakan file perangkat sebanyak mungkin perintah "produsen", misalnya:
xz -cd file1.xz | { xz -cd file2.xz | { diff /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
Meskipun mungkin tidak relevan dalam konteks pertanyaan spesifik Anda, perlu dicatat bahwa:
cmd1 <(cmd2) <(cmd3)
, cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
dan ( cmd2 | ( cmd3 | ( cmd1 /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )
memiliki efek potensial yang berbeda pada lingkungan eksekusi awal.
Bertentangan dengan apa yang terjadi di cmd1 <(cmd2) <(cmd3)
, cmd3
dan cmd1
di cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
tidak akan dapat membaca input apa pun dari pengguna. Itu akan membutuhkan penjelas file lebih lanjut. Misalnya, untuk mencocokkan
diff <(echo foo) <(read var; echo "$var")
Anda akan membutuhkan sesuatu seperti
{ echo foo | { read var 0<&9; echo "$var" | diff /dev/fd/3 -; } 3<&0; } 9<&0
1 Lebih banyak tentang mereka dapat ditemukan di U&L, misalnya dalam Memahami / dev dan subdir serta file-nya .