বাশ: পড়ার সময় লুপটি কার্যকর হয় না within


14

কিছুক্ষণের মধ্যে পড়ার লুপ ইনপুট পড়া কাজ করে বলে মনে হয় না

while read line
do
 echo "get some input from the user"
 read response
done < some_file.txt

এক্সিকিউশনটি যেমন লুপের বাইরে পড়ে থাকত তেমন বিরতি দেয় না। কেন? কিছুক্ষণের মধ্যে পঠন লুপের মধ্যে ইনপুট পড়ার জন্য কোনও কর্মসীমা আছে?

উত্তর:


15

সমস্যা হল উভয় read lineএবং read responseআশা (এবং পায়) থেকে তথ্য stdin। এসও-তে
এই প্রশ্নটি আরও তথ্যের লিঙ্ক সহ এর কিছু ব্যাখ্যা করে।

tl; dr
গৃহীত উত্তরের পরামর্শ:

নিয়ন্ত্রণকারী টার্মিনাল ডিভাইস থেকে পড়ুন: read input </dev/tty


16

অভ্যন্তরীণ পাঠ্য কমান্ডটি স্টিডিন ব্যবহার করতে দিন এবং লুপটির জন্য একটি পৃথক ফাইল বর্ণনাকারী ব্যবহার করুন

while read -u 3 line; do
  read -p "get some input from the user" response
done 3< some_file.txt

1

নিফলে ঠিক ঠিক আছে। আপনি যখন একাধিক টার্মিনাল ব্যবহার করছেন তবে আপনার সুনির্দিষ্ট হওয়া দরকার।

আপনারা যারা গুগল থেকে এসেছেন তাদের জন্য এই পৃষ্ঠাটি সন্ধানের জন্য অভিনন্দন। আপনি (এই অন্তর্ভুক্ত কিছুদিনের পঠিত লুপ চলাকালীন যেকোন ব্যবহারকারীর ইনপুট কি প্রয়োজন rm -i, read, বা অন্য কিছু), আপনি ব্যবহার যা ইনপুট নল নির্দিষ্ট করতে পারেন।

এই সমাধানটির একটি খণ্ড যা আমি ব্যবহার করেছি:

#in declarations
thistty=$(tty)

lsuser -R LDAP -a home pgrp ALL 2>/dev/null | while read line
do
   homedir=$(echo $homedir | awk -F= '{print $2}')
   sudo rm -ir "$homedir" < $thistty
done

1

ধন্যবাদ নিফল! এবং বিজিস্ট্যাককেও ধন্যবাদ। ঘন্টা খানেক সন্ধানের পরে অবশেষে উত্তর পেয়ে গেলাম! ভাল একটা!! আমি আমার টার্মিনাল পথটি সনাক্ত করতে "ইকো $ (টিটি)" ব্যবহার করেছি বা আপনি এটিকে কেবল পরিবর্তনশীল হিসাবে গ্রহণ করেন। আমার জন্য এটি অন্য ব্যবহারের ক্ষেত্রে ছিল। আপনি একটি ফাইল পড়ছিলেন এবং কার্যকর করার বিষয়টি নিশ্চিত করতে চান। হতে পারে নীচের উদাহরণটি অন্য কাউকে সাহায্য করতে পারে।

#!/bin/bash

export terminal=$(tty)

cat file | while read val1 val2
do
   while true; 
            do
              read -p "would you like to XYZ" yn
              case $yn in
                        [Yy]* )     echo "# Move $val1 to $val2        #";break;;
                        [Nn]* )     echo "#---------no action----------#";break;;
                        * )         echo "# Please answer yes or no.   #";;
              esac
            done < $terminal
done

আমার ক্ষেত্রে আমি ছিল whileএকটি নল থেকে পড়া হচ্ছে ... এবং তারপর আমি ফেরৎ ব্যবহৃত stdin থেকে পড়া: read something < %terminal
eftshift0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.