Bash “>> ()” nasıl davranır


9

Çıktı yeniden yönlendirme ve süreç ikamesi denerken aşağıdaki komut ve bunun sonucunda ortaya çıkan çıktıya rastladım:

    ben @ elem: ~ $ echo foo>> (kedi); yankı çubuğu
    bar
    ben @ elem: ~ $ foo

(Evet, sondaki boş satırsonu kasıtlıdır.)

Bash echo'nun çubuğu, her zamanki istemimi yazdırıyor, echo'nun foo'su, echo yeni bir satır ve imlecimi orada bırakıyor. Tekrar enter tuşuna basarsam, istemimi yeni bir satıra yazdırır ve imleci onu takip eder (birisi boş bir komut satırına girdiğinde beklendiği gibi).

Bir dosya tanımlayıcıya foo yazmasını bekliyordum, kedi onu okur ve echo'nun foo'su, ikinci echo echo's bar'ı ve sonra komut istemine geri döner. Ama durum böyle değil.

Birisi neler olduğunu açıklayabilir mi?


Bu konudaki cevaplara bakmanızı öneririm: unix.stackexchange.com/questions/182800/… Çift yönlendirmeyi açıklar ve neden farklı sonuçlarla sonlandığınızı açıklar. Hem Muru hem de Michael Hormers.
Zaman Yok

Bourne Again kabuğunun bazı sürümlerinde , işlem ikamesinin çıktısının istemden sonra neden göründüğü (ve bazı durumlarda hiç görünmüyor) ile açıkça ilgilenen bir soru için , bkz. Unix.stackexchange.com/questions/471987 .
JdeBP

Yanıtlar:


9

Zamanlamaya bağlı olarak, istemden fooönce bar, sonra barveya hatta sonra görüntülenen görebilirsiniz . Tutarlı zamanlama elde etmek için biraz gecikme ekleyin:

$ echo foo > >(sleep 1; cat); echo bar; sleep 2 
bar
foo
$

barhemen, foosonra bir saniye sonra, bir sonraki istem bir saniye sonra görünür .

Olan şey bash'ın arka planda süreç ikamelerini yürütmesidir.

  1. Ana bash işlemi yürütmek için bir alt kabuk başlatır sleep 1; catve buna bir boru kurar.
  2. Ana bash işlemi yürütülür echo foo. Bu, borunun arabelleğini doldurmadığından, echokomut engellemeden sonlandırılır.
  3. Ana bash işlemi yürütülür echo bar.
  4. Ana bash işlemi komutu başlatır sleep 2.
  5. Bu arada, alt kabuk komutu başlatıyor sleep 1.
  6. Yaklaşık 1 saniye sonra sleep 1alt işlemde geri döner. Alt işlem yürütülmeye devam eder cat.
  7. cat girişini çıkışına kopyalar (ekranda görüntülenir) ve geri döner.
  8. Alt kabuk işini bitirdi, çıkar.
  9. Bir saniye sonra sleep 2geri döner. Ana kabuk işlemi yürütmeyi bitirir ve bir sonraki istemi görürsünüz.

3

Bu etkiyi elde etmek için süreç ikamesine ihtiyacınız yoktur. Bunu dene:

( echo foo | cat & )

Aynı sonucu elde edersiniz (olmadan bar; bunu bir egzersiz olarak bırakacağım) ve aynı nedenle. Her iki durumda da, catarka plan görevi olarak başlatılır. Buradaki çizgimde, bu açık. Süreç ikamesi durumunda da açıktır - bir ad dosyası tanımlayıcısına eklenmiş ayrı bir işlemdir - ancak belki de o kadar açık değildir.

Bir bashsonraki istemi yazdırmadan önce alt işlem mutlaka sona ermez . Çıktısı arabelleğe alındığından, sonlanıncaya kadar hiçbir şey çıkarmaz. Bu noktada, bash $stderr'a yeni yazdırdı ve şimdi arka plan işlemi yazdırma foove yeni satırdan sonra çıkıyor .

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.