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.xzdi tempat "$1"untuk keterbacaan dan xz -cdbukan cat ... | xz -dkarena 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 3dan 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<&0dan ( 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), cmd3dan cmd1di cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0tidak 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 .