ZSH: “read: 1: -p: coprocess yok” bash işlevi içinde Okuma komutu başarısız oluyor


29

Düzenle:

İçinde çalışmak gibi görünüyor bash. Sorun ilgili olduğu anlaşılıyor zsh. Bu sorunu yayınlamak için daha iyi bir site varsa bana bildirin.


Bir dizi dizin oluşturan basit bir komut dosyası yazıyorum. Kullanmadan önce kullanıcının onay vermesini istiyorum. Aşağıdakileri temel olarak kullanıyorum, ancak bir bash işlevi içinde çalışmasını sağlayamıyorum. Bir fonksiyonun dışına koyarsam iyi çalışır. İzole bir örnek:

read.sh

#!/bin/bash
test() {
  read -p "Here be dragons. Continue?" -n 1 -r
  if [[ $REPLY =~ ^[Yy]$ ]]
  then
    echo "You asked for it..."
  fi
}

kod bu SO yazı.

Dosya ve / veya kaynak testaşağıdaki hatayla sonuçları: read:1: -p: no coprocess. Aynı çıkışa yerleştirdiğimde aynı çıktı.bashrc

Düzenleme ::

@hennes

  1. İşlev bir yapılandırma dosyasında olmasını istiyorum, bu yüzden herhangi bir dizinden (ideal olarak benim .bashrc veya .zshrc) çağırabilirsiniz
  2. İlk yorum satırının biçimlendirmesini düzelttim. Sorun hala varzsh
  3. Bash sürümü 3.2, ancak sorunun bash değil zsh ile ilgili olduğunu anlamama yardımcı oldunuz.

1) Fonksiyon testini () çağırdığınız herhangi bir yer var mı ? 2) #! /bin/basho shebang arkasında bir boşluk ile? Bunlara izin verilmediğini mi sanıyordum? 3) '#! / Usr / bin / env bash' muhtemelen daha iyidir. 4) Hangi bash sürümü? (FreeBSD'de 4.1.10 bash ile test ettim ve hata aldım)
Hennes

Soruyu yanlış etiketledim, kullanıyorum, zshancak bash komut dosyalarıyla (i doğru çalışan birkaç benzer komut dosyası var) çakışma olacağını düşünmüyordum. Yeniden etiketledim ve sorularınıza yanıt verdim. Beni doğru yöne yönlendirdiğiniz için teşekkürler!
Nick Tomlin

Programı nasıl başlatıyorsunuz? Mesele (#!) Tercüman satırı sadece dosyayı ile çalıştırmak istiyorsanız gereklidir ./read.sh. Başka bir şekilde çalıştırmanız veya bir başlangıç ​​komut dosyasına yerleştirmeniz gerekmez. Ve eğer zsh içinde zsh ./read.sh ile çalıştırmak istiyorsanız # ile başlayan satırlar yok sayılır. Ayrıca zsh kullandığınızda bash kullandığınız izlenimini verdiğinden beri kafa karıştırırlar).
Hennes

@NickTomlin Enter'ı 'y' den sonra (ZSH altında) koymak zorunda kalmadan nasıl çalışacağınızı biliyor musunuz?
syntagma

@REACHUS ne yazık ki yapmıyorum. İyi şanslar!
Nick Tomlin

Yanıtlar:


50

–pSeçeneği için aynı şeyi anlamına gelmez bash's readkomuta dahili ve zsh' ın readkomuta yerleşik. In zshbireyin readkomutuyla, –paraç - tahminim - ‘Giriş önişlemci okunur.’ Size ile istemi görüntüler düşündürmektedir echoveya printf.

Ayrıca veya –n 1ile değiştirmeniz gerekebilir .–k–k 1


zshEşdeğer bashsitesindeki read -p promptisimli

read "?Here be dragons. Continue?"

?Birinci bağımsız değişkende a'dan sonraki her şey bilgi istemi dizesi olarak kullanılır.

Ve elbette okumak için bir değişken adı belirtebilirsiniz (ve bu daha iyi bir stil olabilir):

read "brave?Here be dragons. Continue?"
if [[ "$brave" =~ ^[Yy]$ ]]
then
    ...
fi

(Kabuk değişkenlerinden alıntı yapmak genellikle iyi bir fikirdir.)


Bunun neden düzgün çalışmadığını açıkladığınız için teşekkür ederiz. Gelecekte bunun gibi farklılıkları kontrol edeceğim.
Nick Tomlin

Harika bir açıklama, teşekkürler! Aynı sorun vardı
iosifv

8

Bu kod zsh istediğinizi yapıyor gibi görünüyor.
(Belirttiğiniz sorunun açıkça bash için bahsettiğini unutmayın).

#! / usr / bin / env zsh

Ölçek()
{
  echo -n "İşte ejderhalar. Devam mı?"
  REPLY oku

  [[$ REPLY = ~ ^ [Yy] $]] ise
  sonra
    echo "Siz istediniz ..."
  fi
}

Ölçek

Üç yorum:


Yardımın için teşekkürler. Bunun neden işe yaramadığının açıklaması nedeniyle @scott'a cevap verdim, ancak bana verdiğiniz pasaj mükemmel çalışıyor.
Nick Tomlin

1
Sadece üç şey daha: Bu muhtemelen en iyi SO üzerinde sorulmuştur (bir programlama sorusu olduğu için). 2) Tüm mermiler uyumlu değildir (man zsh okuma -p için farklı şeyler döndürür, sonra man bash yapar. 3) Başka bir çözüm, çeşitli -c -p 'hızlı soru' için arama yapmaktır
Hennes

+1 Bana bildirdiğiniz için teşekkürler. Gelecekteki programlama merkezli soruları SO'ya yönlendireceğim.
Nick Tomlin

Bu işlevin son satırına REPLY=""REPLY değişkenini temizlemek için eklemeniz gerekir . Aksi takdirde $ REPLY yazdığınızda terminalinizi açıp kapatana veya tekrar ayarlayana kadar hala ayarlandığını göreceksiniz.
jasonleonhard

0

Bu sürüm, birden fazla durumda olmasını sağlar yveya Y, nya daN

  1. İsteğe bağlı olarak: Onaylama sorusu sağlanana kadar soruyu tekrarlayın

  2. İsteğe bağlı olarak: Başka bir yanıtı yoksay

  3. İsteğe bağlı olarak: İsterseniz terminalden çıkın

    confirm() {
        echo -n "Continue? y or n? "
        read REPLY
        case $REPLY in
        [Yy]) echo 'yup y' ;; # you can change what you do here for instance
        [Nn]) echo 'nope n' ;;
        # Here are a few optional options to choose between
        # Any other answer:
    
        # 1. Repeat the question
        *) confirm ;;
    
        # 2. ignore
        # *) ;;
    
        # 3. Exit terminal
        # *) exit ;;
    
        esac
        # REPLY=''
    }

Buna da dikkat edin: Bu işlevin son satırında REPLY değişkenini temizleyin. Aksi takdirde echo $REPLY, terminalinizi açana veya kapatana veya tekrar ayarlayana kadar hala ayarlandığını göreceksiniz.

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.