การอ่านอินพุตในขณะอ่านลูปไม่ทำงาน
while read line
do
echo "get some input from the user"
read response
done < some_file.txt
การดำเนินการไม่หยุดเหมือนที่มันจะได้รับการอ่านนอกวง ทำไมนี้ มีวิธีแก้ปัญหาสำหรับการอ่านอินพุตในขณะอ่านลูปหรือไม่?
การอ่านอินพุตในขณะอ่านลูปไม่ทำงาน
while read line
do
echo "get some input from the user"
read response
done < some_file.txt
การดำเนินการไม่หยุดเหมือนที่มันจะได้รับการอ่านนอกวง ทำไมนี้ มีวิธีแก้ปัญหาสำหรับการอ่านอินพุตในขณะอ่านลูปหรือไม่?
คำตอบ:
ปัญหาคือว่าทั้งสองread line
และread response
คาดหวัง (และได้รับ) stdin
ข้อมูลจาก
คำถามเกี่ยวกับ SO นี้อธิบายบางส่วนพร้อมลิงก์ไปยังข้อมูลเพิ่มเติม
tl; dr
คำตอบที่ได้รับการยอมรับแนะนำ:
อ่านจากอุปกรณ์ควบคุม:
read input </dev/tty
ปล่อยให้คำสั่ง inner read ใช้ stdin และใช้ file descriptor อื่นสำหรับลูป while
while read -u 3 line; do
read -p "get some input from the user" response
done 3< some_file.txt
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
ขอบคุณ 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 < %terminal
stdin: