Bash: อินพุตการอ่านภายในขณะที่ลูปอ่านไม่ทำงาน


14

การอ่านอินพุตในขณะอ่านลูปไม่ทำงาน

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

การดำเนินการไม่หยุดเหมือนที่มันจะได้รับการอ่านนอกวง ทำไมนี้ มีวิธีแก้ปัญหาสำหรับการอ่านอินพุตในขณะอ่านลูปหรือไม่?

คำตอบ:


15

ปัญหาคือว่าทั้งสองread lineและread responseคาดหวัง (และได้รับ) stdinข้อมูลจาก
คำถามเกี่ยวกับ SO นี้อธิบายบางส่วนพร้อมลิงก์ไปยังข้อมูลเพิ่มเติม

tl; dr
คำตอบที่ได้รับการยอมรับแนะนำ:

อ่านจากอุปกรณ์ควบคุม: read input </dev/tty



1

Nifle พูดถูก อย่างไรก็ตามเมื่อคุณใช้หลายเครื่องคุณจะต้องเจาะจง

สำหรับคนที่มาจาก 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

ขอบคุณ Nifle! และขอบคุณ bgStack หลังจากค้นหาหลายชั่วโมงในที่สุดฉันก็ได้รับคำตอบ! เยี่ยมมาก !! ฉันใช้ "echo $ (tty)" เพื่อตรวจจับเส้นทางเทอร์มินัลของฉันหรือคุณแค่เอามันมาเป็นตัวแปร สำหรับฉันมันเป็นกรณีการใช้งานอื่น ๆ คุณกำลังอ่านไฟล์และต้องการยืนยันการดำเนินการ บางทีตัวอย่างด้านล่างช่วยให้คนอื่นเห็นด้วย

#!/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 < %terminalstdin:
eftshift0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.