Bir komuta iki boru


9

Aşağıdaki sözdizimiyle biraz kafam karıştı. Çalışmasına rağmen neden çalıştığını anlamıyor. Görünüşe göre diff komutuna bağlı iki boru var. Ama sadece bir tane yok STDINmu?

Örnekler:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)

İşte alakalı topic-- için bir bağlantı süreç ikamesi attiklari bashadam sayfası.
chepner

Yanıtlar:


13

Borular, 0 (stdin) 'den farklı dosya tanımlayıcılarına bağlanır:

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

Bir süreç elbette aynı anda birden fazla açık dosya tanımlayıcıya sahip olabilir, bu yüzden sorun yoktur.


Ben sadece onun geçici boruları bilseydim, ben google mümkün olurdu. Teşekkür ederim!

@iblue: Bunun "geçici borular" olduğunu sanmıyorum. pipe()Sistem çağrısı tarafından yaratıldığı gibi sadece borular .
Sven Marnach

Çok açık olmak gerekirse, "anonim adlandırılmış borular" olarak adlandırılabilir, ancak google için yeterlidir.

2
@WilliamPursell: İlgili dosya yok. Kabuk kullanarak anonim bir boru oluşturur pipe()ve ardından alt işlemleri çatallar. Ana işlem , anonim bir kanal kullanılıyorsa açık olan ek dosya tanımlayıcılarına sahiptir. Bu ek dosya tanımlayıcıları forma geçirilir /dev/fd/...ve işlem genellikle bu dosya adlarını kullanarak bunları açar. Bu, onların dup()daha da açık dosya tanımlayıcıları oluşturmasına neden olur . Süreç ayrıca adlandırılmış dosya tanımlayıcıyı herhangi bir açık çağrı olmadan hemen kullanabilir ...
Sven Marnach

1
... bu küçük ve aptal test programında gösterildiği gibi . İçin derleme sonra a, bunu olarak adlandırılan ./a <(ls)ve başarıyla (benim durumumda 63) isimli dosya decriptor kanıtlayan, dosyaların listesini baskılı zaten açıktı. Bash, Linux'tan farklı mimarilerde geçici bir dizinde adlandırılmış yöneltmeler kullanabilir, bu durumda ana işleme girerken ek dosya tanımlayıcıları açılmaz.
Sven Marnach
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.