জেডএসএইচ: রিড কমান্ড বাশ ফাংশনটির মধ্যে ব্যর্থ হয় "পড়ুন: 1: -পি: কোনও কপ্রোকেস নেই"


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 বা .zshrc)
  2. আমি প্রথম মন্তব্য করা লাইনের বিন্যাস সংশোধন করেছি। সমস্যাটি এখনও রয়েছেzsh
  3. বাশ সংস্করণটি ৩.২, তবে আপনি আমাকে বুঝতে সাহায্য করেছেন যে সমস্যাটি zsh এর সাথে আছে, বাশ নয়।

1) এমন কোনও জায়গা আছে যেখানে আপনি প্রকৃতপক্ষে ফাংশন টেস্টটি কল করেন () ? ২) #! /bin/bashসে শেবাংয়ের পিছনে একটি জায়গা আছে? আমি ভেবেছিলাম তাদের অনুমতি দেওয়া হয়নি? 3) '#! / Usr / bin / env বাশ' সম্ভবত আরও ভাল। 4) কোন বাশ সংস্করণ? (আমি ফ্রিবিএসডি-তে 4.1.10 বাশ দিয়ে পরীক্ষা করেছি এবং কোনও ত্রুটি পাইনি)
হেনেস

আমি ভুলভাবে প্রশ্নটি ট্যাগ করেছিলাম, আমি ব্যবহার করছি zshতবে ভাবিনি যে ব্যাশ স্ক্রিপ্টগুলির সাথে দ্বন্দ্ব হবে (আমার কাছে আরও বেশ কয়েকটি অনুরূপ স্ক্রিপ্ট রয়েছে যা ঠিক আছে)। আমি এটিকে পিছনে ফেলেছি এবং আপনার প্রশ্নের জবাব দিয়েছি। আমাকে সঠিক দিকে নির্দেশ করার জন্য ধন্যবাদ!
নিক টমলিন

আপনি কিভাবে প্রোগ্রাম শুরু করবেন? শেবাং (#!) ইন্টারপ্রিটার `লাইন কেবলমাত্র তখনই দরকার হয় যদি আপনি ফাইলটি চালাতে চান ./read.sh। এটির প্রয়োজন হয় না আপনি এটি অন্য কোনও উপায়ে চালান বা আপনি এটি একটি স্টার্টআপ স্ক্রিপ্টে রাখলে। এবং আপনি যদি এটি zsh এ `zsh ./read.sh 'দিয়ে চালাতে চান তবে একটি # দিয়ে শুরু হওয়া লাইনগুলি উপেক্ষা করা হবে। এগুলি এহেতু বিভ্রান্ত হয় যেহেতু তারা এই ধারণা দেয় যে আপনি জ্যাশ ব্যবহার করার সময় আপনি ব্যাশ ব্যবহার করেন)।
হেনেস

@ নিকটমলিন আপনি কি জানেন যে 'y' এর পরে এন্টার (জেডএসএইচের অধীনে) না রেখে কীভাবে এটি কাজ করা যায়?
সিন্ট্যাগমা

@REachus হায়, আমি না। শুভকামনা!
নিক টমলিন

উত্তর:


50

–pবিকল্পে একই জিনিস মানে এই নয় bash's 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

পরীক্ষা ()
{
  প্রতিধ্বনি -n "এখানে ড্রাগন থাকুন। চালিয়ে যাবেন?"
  পুনরায় পড়ুন

  যদি [[PL REPLY = ~ ^ [Yy] $]]
  তারপর
    প্রতিধ্বনি "আপনি এটি চেয়েছিলেন ..."
  ফাই
}

পরীক্ষা

তিনটি মন্তব্য:


আপনার সাহায্যের জন্য ধন্যবাদ। এটি কেন কাজ করছে না তা ব্যাখ্যা করার কারণে আমি @ স্কটকে উত্তর দিয়েছি তবে আপনি যে স্নিপেট আমাকে দিয়েছেন তা পুরোপুরি কার্যকরভাবে কাজ করে।
নিক টমলিন

1
আরও তিনটি জিনিস: এটি সম্ভবত সবচেয়ে ভাল জিজ্ঞাসা করা হয়েছিল (যেমন এটি একটি প্রোগ্রামিং প্রশ্ন)। ২) সমস্ত শাঁস সামঞ্জস্যপূর্ণ নয় (ম্যান জেডএস পড়ার জন্য বিভিন্ন জিনিস ফেরত দেয়) তবে মানুষ বাশ করে Another) আরেকটি সমাধান হতে পারে সন্ধান করা- v -c -p 'প্রম্পট প্রশ্ন'
হেনেস

+1 আমাকে জানাতে ধন্যবাদ। আমি ভবিষ্যতে প্রোগ্রামিং-কেন্দ্রিক প্রশ্নগুলিকে এসও-তে পাঠাব।
নিক টমলিন

এই ফাংশনের শেষ লাইনে আপনাকে REPLY=""REPLY ভেরিয়েবল সাফ করার জন্য যুক্ত করা উচিত । অন্যথায় আপনি যদি প্রতিধ্বনি করেন $ তবে আপনি নিজের টার্মিনালটি খুলতে বা বন্ধ না করা বা এটি পুনরায় সেট না করা অবধি সেটটি স্থিত দেখতে পাবেন।
জেসনলোনহার্ড

0

এই সংস্করণ আপনাকে একাধিক কেস yবা Y, nবাN

  1. Allyচ্ছিকভাবে: অনুমোদনের প্রশ্ন সরবরাহ না করা পর্যন্ত প্রশ্নটি পুনরাবৃত্তি করুন

  2. Allyচ্ছিকভাবে: অন্য কোনও উত্তর উপেক্ষা করুন

  3. Allyচ্ছিকভাবে: আপনি চাইলে টার্মিনাল থেকে প্রস্থান করুন

    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দেখতে পান এটি আপনার টার্মিনালটি খোলার বা বন্ধ না করা বা এটি পুনরায় সেট না করা অবধি এখনও সেট করা আছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.