Dua pipa untuk satu perintah

9

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)
iblue
sumber
Berikut ini tautan ke topik yang relevan - substitusi proses - di bashhalaman manual.
chepner

Jawaban:

13

Pipa-pipa tersebut hanya terikat pada deskriptor file yang berbeda dari 0 (stdin):

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

Suatu proses tentu saja dapat memiliki lebih dari satu deskriptor file terbuka sekaligus, jadi tidak ada masalah.

Sven Marnach
sumber
Kalau saja saya tahu itu disebut pipa sementara, saya akan bisa google itu. Terima kasih!
@iblue: Saya tidak berpikir itu disebut "pipa sementara". Ini hanya pipa, seperti yang dibuat oleh pipe()system call.
Sven Marnach
Untuk lebih tepatnya, ini mungkin disebut "anonim named pipes", tetapi cukup untuk google saja.
2
@WilliamPursell: Tidak ada file yang terlibat. Shell membuat pipa anonim menggunakan 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 menjadi dup()ed, membuat deskriptor file lebih terbuka. Prosesnya juga dapat menggunakan deskriptor file bernama segera tanpa panggilan terbuka ...
Sven Marnach
1
... seperti yang ditunjukkan dalam program pengujian kecil dan bodoh ini . Setelah dikompilasi 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.
Sven Marnach