In zsh, cat <(cat) vs cat arasındaki fark | kedi vs kedi = (kedi)?


18

Beklediğim cat <(cat)ve cat | cataynı şeyi yapmak: stdin stdout satırları kopyalayın. Anladığım kadarıyla, her ikisi de catbir alt kabukta a yürütecek , alt kabuğun stdout'unu catgeçici bir adlandırılmış boruya yönlendirecek ve daha sonra catmevcut kabukta başka bir parçayı boruya yönlendirilmiş olacaktı.

Bunun yerine, cat <(cat)terminalime yazmama izin verin, ancak giriş satırlarının hiçbiri kopyalanmaz ve ^Dsinyal veremez EOF; cat | catbeklendiği gibi çalışıyor.

Başka bir deney cat =(cat)olarak cat <(cat), benzer zorluklara sahip olup olmadığını kontrol ettim , ancak beklediğim gibi çalışıyor: ^Dbir seferde tüm stdin , bir seferde stdout'a kopyalanıyor.

Herkes kaputun altında zsh ne yaptığını anlamama yardımcı olabilir mi?

Yanıtlar:


23
  1. a | bbağlanır STDOUTgelen ave STDINgelen bsadece kullanarak dup/dup2. Her iki komut da paralel olarak yürütülür.

  2. a =(b)argümanını ageçici bir dosya adıyla değiştirir. geçici dosyanın geçirilebilmesi için bdaha önce yürütüldüğündenaa

  3. a <(b)argümanını aadlandırılmış bir kanalla değiştirir. ave bparalel olarak çalıştırın. Şimdi burası biraz karmaşıklaşıyor:

    barka planda ve terminalden okuyamıyor. strace -p $PIDİşlemi görmek için ikinci kedi işleminize eklemek için kullanarak kendiniz test edebilirsiniz .

    abu arada adlandırılmış kanaldan okumaya çalışır, ancak hiçbir şeyi okuyamayacağı gibi bokuyamaz.

    • Bu a, okumaya çalıştığınız bancak bokuyamayacağınız STDINve yazamayacağınız bir çıkmaza sahip olduğunuz anlamına gelira

Arka plan işlemi ve man bash terminali hakkında daha fazla bilgi :

Kullanıcı arabiriminin iş denetimine uygulanmasını kolaylaştırmak için, işletim sistemi geçerli bir terminal işlem grubu kimliği kavramını korur . Bu işlem grubunun üyeleri (işlem grubu kimliği geçerli terminal işlem grubu kimliğine eşit olan işlemler), SIGINT gibi klavye tarafından üretilen sinyalleri alır . Bu süreçlerin ön planda olduğu söyleniyor . Arka fonsüreçler, süreç grubu kimliği terminalden farklı olanlardır; bu tür işlemler klavye tarafından üretilen sinyallere karşı bağışıktır. Yalnızca ön plan işlemlerinin okunmasına izin verilir veya kullanıcı stty tostop ile belirtiyorsa terminale yazar. Terminalden okumaya çalışan arka plan işlemleri (stty tostop etkinken yaz ) , çekirdeğin terminal sürücüsü tarafından bir SIGTTIN (SIGTTOU) sinyali gönderilir ve yakalanmadığı sürece işlemi askıya alır.


Harika, teşekkür ederim - bu çok şey temizlendi!
Alan O'Donnell

1
Etkileşimli olmadığında, zsh, arka plan komutlarının standart girişini (içinde olanlar da dahil olmak üzere <(cmd)) olarak yeniden yönlendirir /dev/null, bu nedenle davranış farklıdır ( zsh -c 'cat <(cat)'hemen geri döner ve hiçbir şey çıktılamaz).
Stéphane Chazelas
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.