Boru, çekirdek içi dosya sisteminde açılan bir dosyadır ve diskteki normal bir dosya olarak erişilemez. Otomatik olarak yalnızca belirli bir boyuta arabelleğe alınır ve sonunda dolduğunda engellenir. Blok cihazlardan alınan dosyalardan farklı olarak, borular karakter cihazlarına çok benzer ve genellikle desteklemez lseek()
ve onlardan okunan veriler normal bir dosyada yapabileceğiniz gibi tekrar okunamaz.
Here-string, bağlı bir dosya sisteminde oluşturulan normal bir dosyadır. Kabuk dosyayı oluşturur ve dosyaya / dosyasından bir bayt yazmadan / okumadan önce tek dosya sistemi bağlantısını hemen kaldırırken (ve böylece siler) tanımlayıcısını korur . Çekirdek, tüm işlemler dosya için tüm tanımlayıcıları serbest bırakana kadar dosya için gereken alanı koruyacaktır. Böyle bir tanımlayıcıdan okuyan çocuk bunu yapabilirse, geri sarabilir lseek()
ve tekrar okuyabilir.
Her iki durumda da belirteçler <<<
ve |
dosya tanımlayıcıları temsil eder ve dosyaların kendileri olmak zorunda değildir. Aşağıdaki gibi şeyler yaparak neler olduğu hakkında daha iyi bir fikir edinebilirsiniz:
readlink /dev/fd/1 | cat
...veya...
ls -l <<<'' /dev/fd/*
İki dosya arasındaki en önemli fark, burada-string / doc'ın hemen hemen hepsi bir arada bir olay olmasıdır - kabuk, okuma tanımlayıcısını çocuğa sunmadan önce tüm verileri içine yazar. Öte yandan, kabuk boruyu uygun tanımlayıcılar üzerinde açar ve çocukları boru için olanları yönetmeleri için yönlendirir - ve böylece her iki uçta eşzamanlı olarak yazılır / okunur .
Ancak bu ayrımlar genellikle genel olarak doğrudur. Bildiğim kadarıyla (gerçekten o kadar da değil) bu, tek bir istisna dışında burada belge yeniden yönlendirmesi <<<
için burada-string kısa-elini işleyen hemen hemen her kabuk için <<
geçerlidir yash
. yash
, busybox
, dash
, Diğer ve ash
varyantları ve bu yüzden bu kabuklarda gerçekten sonuçta ikisi arasında çok az fark vardır gerçi, borularla buraya-belgeleri geri eğilimi yoktur.
Tamam - iki istisna. Şimdi düşündüğüm için, ksh93
aslında hiç bir boru yapmaz |
, aksine tüm iş w / soket işler - <<<*
çoğu diğerleri gibi silinen bir tmp dosyası yapar. Dahası, bir boru hattının ayrı bölümlerini, en azından bir alt kabuk gibi davranan bir tür POSIX örtücüsü olan bir alt kabuk ortamına koyar ve çatalları bile yapmaz.
Gerçek şu ki, @ PSkocik'in (çok faydalı olan) karşılaştırmalı değerlendirme sonuçları birçok nedenden dolayı büyük ölçüde değişebilir ve bunların çoğu uygulamaya bağlıdır. Buradaki belge kurulumu için en büyük etkenler hedef ${TMPDIR}
dosya sistemi türü ve mevcut önbellek yapılandırması / kullanılabilirliği ve yine de yazılacak veri miktarıdır. Boru için kabuk işleminin kendisi olacaktır, çünkü gerekli çatallar için kopyalar yapılır. Bu şekilde de bash
olduğu korkunç boru hattı kurulumu sırasında (içerecek şekilde $(
komut )
değiştirmelerin) - bu büyük ve çünkü çok yavaş, fakat ksh93
hepsi de neredeyse hiç fark etmez.
Bir kabuğun bir boru hattı için alt kabuklardan nasıl ayrıldığını göstermek için başka bir küçük kabuk snippet'i:
pipe_who(){ echo "$$"; sh -c 'echo "$PPID"'; }
pipe_who
pipe_who | { pipe_who | cat /dev/fd/3 -; } 3<&0
32059 #bash's pid
32059 #sh's ppid
32059 #1st subshell's $$
32111 #1st subshell sh's ppid
32059 #2cd subshell's $$
32114 #2cd subshell sh's ppid
Bir Ardışık Ne arasındaki fark pipe_who()
çağrı raporları ve geçerli kabuğunda bir çalışmasının raporuna bir kaynaklanmaktadır (
altkabuk en )
ebeveyn kabuğun pid talep etme belirtilen davranışı $$
o genişletildiğinde. bash
Alt $$
kabuklar kesinlikle ayrı süreçler olsa da , özel kabuk parametresi bu bilgilerin güvenilir bir kaynağı değildir. Yine de, subshell'in çocuk sh
kabuğu, bunu doğru bir şekilde bildirmeyi reddetmez $PPID
.