ZSH: बैश फ़ंक्शन के भीतर पढ़ें कमांड विफल रहती है "पढ़ें: 1: -p: कोई कॉपीराइट नहीं"


29

संपादित करें:

भीतर काम करने लगता है bash। यह समस्या से संबंधित है प्रकट होता है zsh। अगर इस मुद्दे को पोस्ट करने के लिए एक बेहतर साइट है तो मुझे बताएं।


मैं एक सरल स्क्रिप्ट लिख रहा हूं जो निर्देशिकाओं की एक श्रृंखला बनाता है। मैं चाहता हूं कि ऐसा करने से पहले उपयोगकर्ता पुष्टि कर दे। मैं एक आधार के रूप में निम्नलिखित का उपयोग कर रहा हूं, लेकिन इसे बश फ़ंक्शन के भीतर चलाने के लिए प्राप्त नहीं कर सकता। अगर मैं इसे किसी फ़ंक्शन के बाहर रखता हूं तो यह ठीक काम करता है। यहाँ एक अलग उदाहरण है:

read.sh

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

इस एसओ पद से कोड ।

testनिम्न त्रुटि में फ़ाइल और / या परिणाम सोर्सिंग read:1: -p: no coprocess:। उसी आउटपुट जब मैं इसे अपने में रखता हूं.bashrc

संपादित करें :

@hennes

  1. मैं चाहता हूं कि फ़ंक्शन एक कॉन्फ़िगर फ़ाइल में हो, इसलिए मैं इसे जो भी निर्देशिका (आदर्श रूप से मेरे .bashrc या .zshon) से कॉल कर सकता हूं।
  2. मैंने पहली टिप्पणी लाइन के प्रारूपण को सही किया है। अभी भी समस्या मौजूद हैzsh
  3. बैश संस्करण 3.2 है, लेकिन आपने मुझे यह पता लगाने में मदद की है कि समस्या zsh के साथ है और बैश नहीं है।

1) क्या कोई जगह है जहां आप वास्तव में फ़ंक्शन परीक्षण () कहते हैं ? 2) #! /bin/bashशबंग के पीछे एक स्पेस के साथ? मैंने सोचा कि उन लोगों को अनुमति नहीं दी गई थी? 3) '#! / Usr / bin / env bash' शायद बेहतर है। 4) कौन सा बैश संस्करण? (मैंने FreeBSD पर बैश 4.1.10 के साथ परीक्षण किया और कोई त्रुटि नहीं मिली)
हेन्नेस

मैंने अनुचित तरीके से प्रश्न को टैग किया, मैं उपयोग कर रहा हूं zshलेकिन यह नहीं सोचा था कि बैश स्क्रिप्ट के साथ संघर्ष होगा (मेरे पास कई अन्य समान स्क्रिप्ट हैं जो सभी सही चल रहे हैं)। मैंने इसे पुनः प्राप्त कर लिया है, और आपके प्रश्नों का उत्तर दिया है। मुझे सही दिशा बताने के लिए धन्यवाद!
निक टोमलिन

आप कार्यक्रम कैसे शुरू करते हैं? यदि आप फ़ाइल को निष्पादित करना चाहते हैं तो शेबबैंग (#!) दुभाषिया 'लाइन की जरूरत है ./read.sh। इसकी आवश्यकता नहीं है कि आप इसे किसी अन्य तरीके से चलाते हैं या यदि आप इसे स्टार्टअप स्क्रिप्ट में रखते हैं। और अगर आप इसे। Zsh/read.sh ’के साथ zsh में चलाना चाहते हैं तो # से शुरू होने वाली लाइनों को अनदेखा कर दें। वे भी भ्रमित करते हैं क्योंकि उनके द्वारा यह धारणा दी जाती है कि जब आप zsh का उपयोग करते हैं तो आप बैश का उपयोग करते हैं)।
हेन्नेस

@NickTomlin क्या आप जानते हैं कि 'y' (ZSH के तहत) के बाद एंटर किए बिना कैसे काम करना है?
वाक्य

@REACHUS अफसोस, मैं नहीं। सौभाग्य!
निक टोमलिन

जवाबों:


50

–pविकल्प के लिए एक ही बात मतलब यह नहीं है bash'एस readमें निर्मित कमान और zshके readआदेश में निर्मित। में zshके readआदेश, –pका मतलब है - अनुमान - "इनपुट coprocess से पढ़ा जाता है।" मेरा सुझाव है कि आप के साथ अपने संकेत प्रदर्शित echoया printf

आपको या के –n 1साथ प्रतिस्थापित करने की आवश्यकता हो सकती है ।–k–k 1


zshके बराबर bashकी read -p promptहै

read "?Here be dragons. Continue?"

?पहले तर्क में कुछ के बाद संकेत स्ट्रिंग के रूप में उपयोग किया जाता है।

और निश्चित रूप से आप में पढ़ने के लिए एक चर नाम निर्दिष्ट कर सकते हैं (और यह बेहतर शैली हो सकती है):

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

(शेल चर का उद्धरण आमतौर पर एक अच्छा विचार है, भी)


यह क्यों ठीक से काम नहीं कर रहा है की व्याख्या के लिए धन्यवाद। मैं भविष्य में इस तरह के मतभेदों की जांच करूंगा।
निक टॉमलिन

शानदार व्याख्या, धन्यवाद! ठीक यही समस्या थी
iosifv

8

यह कोड आपको वही लगता है जो आप zsh में चाहते हैं।
(ध्यान दें कि जिस प्रश्न का आपने उल्लेख किया है, वह स्पष्ट रूप से उल्लेख के लिए है)।

#! / usr / bin / env zsh

परीक्षा()
{
  इको-एन "यहां ड्रेगन रहें। जारी रखें?"
  पढ़ें

  अगर [[$ REPLY = ~ ^ [Yy] $]]
  फिर
    गूंज "आपने इसके लिए कहा ..."
  फाई
}

परीक्षा

तीन टिप्पणियाँ:


आपके सहयोग के लिए धन्यवाद। मैंने @scott का जवाब इस कारण से दिया है कि यह कार्य क्यों नहीं कर रहा है, लेकिन आपने मुझे जो स्निपेट दिया है वह पूरी तरह से काम करता है।
निक टोमलिन

1
बस तीन और बातें: यह शायद SO पर सबसे अच्छा पूछा गया था (क्योंकि यह एक प्रोग्रामिंग सवाल है)। 2) सभी गोले संगत नहीं हैं (मैन zsh रीड -p के लिए अलग-अलग सामान देता है फिर मैन बैश करता है। 3) एक और उपाय vared -c -p 'प्रॉम्प्ट क्वेश्चन' के लिए सर्च किया जाएगा
हेन्स

+1 मुझे बताने के लिए धन्यवाद। मैं भविष्य के प्रोग्रामिंग-केंद्रित प्रश्नों को SO को निर्देशित करूँगा।
निक टोमलिन

इस फ़ंक्शन की अंतिम पंक्ति पर आपको REPLY=""REPLY चर को साफ़ करने के लिए जोड़ना चाहिए । अन्यथा यदि आप $ REPLY को प्रतिध्वनित करते हैं तो आप देखेंगे कि यह तब भी सेट है जब तक आप अपना टर्मिनल खोलते या बंद नहीं करते या इसे फिर से सेट नहीं करते।
jasonleonhard

0

यह संस्करण आपको एक से अधिक मामलों yया Y, nया के लिए अनुमति देता हैN

  1. वैकल्पिक रूप से: प्रश्न को तब तक दोहराएं जब तक कि स्वीकृत प्रश्न प्रदान नहीं किया जाता है

  2. वैकल्पिक रूप से: किसी अन्य उत्तर को अनदेखा करें

  3. वैकल्पिक रूप से: यदि आप चाहें तो टर्मिनल से बाहर निकलें

    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=''
    }

इसे भी नोट करें: इस फ़ंक्शन की अंतिम पंक्ति पर REPLY चर को साफ़ करें। अन्यथा यदि आप echo $REPLYदेखेंगे कि यह तब भी सेट है जब तक आप अपने टर्मिनल को खोलते या बंद नहीं करते हैं या इसे फिर से सेट नहीं करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.