Sistem bilgisi:
macOS Sierra 10.12.6
zsh 5.4.2 (x86_64-apple-darwin16.7.0)
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0)
Yaptığım basitleştirilmiş örnekleri incelemek istiyorsanız alttaki ÖRNEKLER'e gidin .
NOT: Ben büyük bir zshkullanıcı değilim .
Ben bakıyordu fzfiçin keybinding bashve zsh.
İkisinin de nasıl değişken bir komut çalıştırdığına dikkat edin $(__fzfcmd). __fzfcmdvarsayılan fzfolarak stdout'a çıkış yapar ve parametre ikamesi sadece fzfçıktıdan kaynaklanan command ( ) komutunu çalıştırır .
bashVe zshscript arasındaki bir fark , bashbirinin çıktısını daha da borulaştırması, $(__fzfcmd)ancak zshonu bir dizinin içinde yakalamasıdır. Benim tahminim, zshdaha fazla fzfgiriş yapamayacağınız yerin çıkışını daha fazla boruya bağladığınızda fzfve tarafından yapılan işlemin fzfherhangi bir stdin almaması nedeniyle bir sorundan kaynaklanıyor . Tek seçeneğiniz ^Zveya ^C. ^Cbir nedenden ötürü sürecin arka planını oluşturuyor gibi görünüyor. Ya da belki bir dizide istediler, böylece üzerinde çalışabilirlerdizle vi-fetch-history . bashVersiyon anahtarında bazı sihirli ile bağlama yapar"\e^": history-expand-line
Şimdi fzfönemli değil. ttyBu soruna neden olmak için parametre yerine koyma tarafından çağrılacak bir programa ihtiyacınız var gibi görünüyor . Bu yüzden bazı basit örnekleri göstereceğim.
Aşağıda, ttybu soruna neden olabilecek bazı komutlar verilmiştir zsh:
- vipe (editörü bir borunun ortasında çalıştır)
'vim -'(vim'i stdin'den okuyun. vipe'a benzer, ancak stdout'a çıkmaz)
Aşağıdaki örneklerde, her geçtiği yerini vipeile vim -ayrı yüklemek yapmak istemiyorsanız. Sadece vim -editör içeriğini stdout'a olduğu gibi çıkarmayacağını unutmayın vipe.
ÖRNEKLER:
1) echo 1 | vipe | cat # works in both bash and zsh
2) echo 1 | $(echo vipe) | cat # works in bash only. zsh problem with no output until I hit `^C`:
^C
zsh: done echo 1 |
zsh: suspended (tty output) $(echo vipe) |
zsh: interrupt cat
# seems like the process is backgrounded. I can still see it in jobs command
3) cat <(echo 1 | $(echo vipe)) # zsh and bash has the problem. I'm guessing because
# the file isn't finished writing and cat is
# blocking vipe's tty output
# both their `^C` output is just:
^C # nothing special, as expected
4) cat < <(echo 1 | $(echo vipe)) # works in both bash and zsh
5) echo 1 | $(echo vipe) > >(cat) # works in both bash and zsh
# The following don't have and input pipe to vipe.
# Type something then send EOF with ^D
6) vipe | cat # works for both
7) $(echo vipe) | cat # works for both
Şimdi, çoğunlukla neden merak ediyorum 2)için bir sorun vardır zshama için bashve neden 4)ve 5)düzeltmeleri için problem zsh.
zshBu soruna sahip olmak için gereksinimler tam olarak başlığa koyduğum gibi görünüyor:
- giriş borusu
ttyçıktısı olan değişken / parametre değiştirme ile çalıştır komutu- çıkış borusu
GÜNCELLEME
zshBu soruna neden olmayan başka bir geçici çözüm ekledim 5). Buna benzer, 4)ancak stdoutdoğrudan içine yönlendirmek yerine, işlem ikamesini kullanarak stinyönlendiren bir dosyaya yönlendiriyorum stdin.
when either a computer program or system ceases to respond to inputs
(echo | $(echo vipe) | cat)
pssize söyleyeceği gibi, bu vakaların hiçbirinde donmuş veya sıkışmış kabuklar yoktur. Çocuk süreçlerini normal şekilde bekliyorlar; ve bu alt süreçler askıya alındığında veya sonlandırıldığında, normal şekilde girdi istemeye geri dönerler. Soru başlığınız ve bedeniniz örtük bir yanlış öncül içeriyor. "Kabuğum neden donuyor?" Kabuk bir cevaplanamaz yüklü soru değil aslında ilk etapta dondurma. Bu örtülü yanlış önermeyi kaldırmak için daha iyi bir sorunuz olacaktır.