zsh, stdin ve stdout'u tty çıkışı olan değişken komutla bağlarken terminale giremez


11

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.


1
Çıktının 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.
JdeBP

Tamam, değiştirebilirim. İşlemin artık CPU'da talimatları çalıştıramayacağı anlamıyla donmuş değil. Sadece beklemekte haklısın. Ama 'sıkışmış' değil mi? Giremeyi bekliyor Bunu sağlayamıyorum. Bunu kısaca açıklamak için daha iyi bir terim nedir? Bu hang when either a computer program or system ceases to respond to inputs
dosentmatter

1
Kabuk girişi beklemiyor. Çocuklarını bekliyor. Bu soru basitçe ne olduğunu açıklamak daha iyi olur . "Kabuğum donmuş" gibi hipotezler ve çıkarımlar oluşturmayın ve sonra çıkarımlar hakkında soru sorun. Ne olduğunu açıklayın ve bunun hakkında sorular sorun: Özel karakter terminali giriş dizilerinin (normalde ön plandaki işi askıya alacak veya işi kesecek veya işten ayrılacak veya terminalden okuma işlemine bir EOF göstergesi gönderecek) hiçbir etkisi yoktur. Ne oluyor? Neden? . Bu arada Debian Linux ve FreeBSD / TrueOS üzerinde de çoğaltılabilir,
JdeBP

1
Ben ettik zsh gelişme posta listesinde hata bildirildi . Şimdilik, bir alt kabuğa sararak etrafında çalışabilmelisiniz(echo | $(echo vipe) | cat)
Stéphane Chazelas

1
Süreç ikamelerinin arka planda başlatılması gerçeği bence (veya en azından biliniyor)
Stéphane Chazelas

Yanıtlar:


0

Sorununuzun genişlemelerinizi yanlış bir şekilde alıntılamaktan kaynaklandığına inanıyorum.

Zsh'tan alıntı : 14 Genişleme

Dolar işareti $(...)ile başlayan veya ' ...' gibi ciddi aksanlarla alıntılanan parantez içine alınmış bir komut , standart çıkışıyla değiştirilir ve sondaki yeni satırlar silinir. İkame çift tırnak içine alınmazsa, çıktı IFS parametresi kullanılarak kelimelere bölünür. İkame $(cat foo), eşdeğer ancak daha hızlı ile değiştirilebilir $(<foo). Her iki durumda da, GLOB_SUBST seçeneği ayarlanmışsa, çıktı dosya adı üretimi için uygundur.

Sorunuzdaki Örnek 2'nin aşağıdakilere bağlı olarak NULL değerinin sonsuz bir yankısına neden olduğunu unutmayın:

İkame çift tırnak içine alınmazsa, çıktı IFS parametresi kullanılarak kelimelere bölünür.

Başka bir deyişle, kabuk sınırsız olarak bekler echo, çünkü varsayılan sınırlayıcı SPACE olduğundan, yankı asla tamamlanmaz. Bkz. TLDP: İç Değişkenler . Bu, catkomuta için asılı bir boru bırakır .

Bir yığın olarak, çıkış yönlendirmesi nedeniyle 4 ve 5'in çalıştığına inanıyorum.

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.