बैश: रीडिंग लूप के भीतर इनपुट पढ़ना काम नहीं करता है


14

थोड़ी देर के लूप में रीडिंग इनपुट काम नहीं करता है

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

निष्पादन इस तरह से विराम नहीं देता है जैसे कि यह लूप के बाहर पढ़ा गया हो। ऐसा क्यों है? क्या कुछ समय के लिए इनपुट पढ़ने के लिए एक वर्कअराउंड लूप है?

जवाबों:


16

समस्या यह है कि दोनों से 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

निफ़ल यह बिल्कुल सही है। जब आप कई टर्मिनलों का उपयोग कर रहे हैं, हालांकि, आपको विशिष्ट होने की आवश्यकता है।

आप में से जो लोग Google से आ रहे हैं, उन्हें इस पेज को खोजने के लिए बधाई। आप (यह भी शामिल है एक समय पढ़ने पाश के दौरान किसी भी उपयोगकर्ता इनपुट करने के लिए की जरूरत है 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

धन्यवाद निफ़ल! और bgStack का भी धन्यवाद। घंटों खोज करने के बाद आखिरकार मुझे जवाब मिल गया! महान एक!! मैंने अपने टर्मिनल पथ का पता लगाने के लिए "इको $ (ट्टी)" का उपयोग किया या आप इसे केवल चर के रूप में लेते हैं। मेरे लिए यह एक अन्य उपयोग का मामला था। यू एक फ़ाइल पढ़ रहा था और निष्पादन की पुष्टि करना चाहेगा। हो सकता है कि नीचे दिए गए उदाहरण से किसी और को बाहर निकलने में मदद मिले।

#!/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एक पाइप से पढ़ा था ... और फिर मैंने स्टड से पढ़ने के लिए पुनर्निर्देशन का उपयोग किया read something < %terminal:।
eftshift0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.