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 zsh
kullanıcı değilim .
Ben bakıyordu fzf
için keybinding bash
ve zsh
.
İkisinin de nasıl değişken bir komut çalıştırdığına dikkat edin $(__fzfcmd)
. __fzfcmd
varsayılan fzf
olarak stdout'a çıkış yapar ve parametre ikamesi sadece fzf
çıktıdan kaynaklanan command ( ) komutunu çalıştırır .
bash
Ve zsh
script arasındaki bir fark , bash
birinin çıktısını daha da borulaştırması, $(__fzfcmd)
ancak zsh
onu bir dizinin içinde yakalamasıdır. Benim tahminim, zsh
daha fazla fzf
giriş yapamayacağınız yerin çıkışını daha fazla boruya bağladığınızda fzf
ve tarafından yapılan işlemin fzf
herhangi bir stdin almaması nedeniyle bir sorundan kaynaklanıyor . Tek seçeneğiniz ^Z
veya ^C
. ^C
bir 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
. bash
Versiyon anahtarında bazı sihirli ile bağlama yapar"\e^": history-expand-line
Şimdi fzf
önemli değil. tty
Bu 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, tty
bu 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 vipe
ile 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 zsh
ama için bash
ve neden 4)
ve 5)
düzeltmeleri için problem zsh
.
zsh
Bu 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
zsh
Bu soruna neden olmayan başka bir geçici çözüm ekledim 5)
. Buna benzer, 4)
ancak stdout
doğrudan içine yönlendirmek yerine, işlem ikamesini kullanarak stin
yönlendiren bir dosyaya yönlendiriyorum stdin
.
when either a computer program or system ceases to respond to inputs
(echo | $(echo vipe) | cat)
ps
size 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.