Saya sedikit bingung dengan sintaks berikut. Meskipun berhasil, ia tidak mengerti mengapa itu bekerja. Sepertinya, ada dua pipa yang melekat pada perintah diff. Tapi bukankah hanya ada satu STDIN
?
Contoh:
diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)
bash
halaman manual.Jawaban:
Pipa-pipa tersebut hanya terikat pada deskriptor file yang berbeda dari 0 (stdin):
Suatu proses tentu saja dapat memiliki lebih dari satu deskriptor file terbuka sekaligus, jadi tidak ada masalah.
sumber
pipe()
system call.pipe()
dan kemudian garpu subproses. Proses utama memang memiliki deskriptor file tambahan terbuka jika pipa anonim digunakan. Deskriptor file tambahan ini diteruskan dalam bentuk/dev/fd/...
, dan proses biasanya hanya akan membukanya menggunakan nama file ini. Ini akan menyebabkan mereka menjadidup()
ed, membuat deskriptor file lebih terbuka. Prosesnya juga dapat menggunakan deskriptor file bernama segera tanpa panggilan terbuka ...a
, saya menyebutnya sebagai./a <(ls)
, dan berhasil mencetak daftar file, membuktikan decriptor file bernama (63 dalam kasus saya) sudah terbuka. Bash mungkin menggunakan pipa bernama dalam direktori sementara pada arsitektur yang berbeda dari Linux, dalam hal ini tidak ada deskriptor file tambahan yang akan terbuka saat memasuki proses utama.