Bash: đọc đầu vào trong khi vòng lặp đọc không hoạt động


14

Đọc đầu vào trong vòng lặp đọc trong một thời gian dường như không hoạt động

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

thực hiện không tạm dừng như nó sẽ có đọc bên ngoài vòng lặp. Tại sao lại thế này? Có một cách giải quyết để đọc đầu vào trong vòng lặp đọc không?

Câu trả lời:


15

Vấn đề là cả hai read lineread responsemong đợi (và được) dữ liệu từ stdin.
Câu hỏi này về SO giải thích một số câu hỏi với một liên kết đến nhiều thông tin hơn.

tl; dr
Câu trả lời được chấp nhận cho thấy:

Đọc từ thiết bị đầu cuối điều khiển: read input </dev/tty


16

hãy để lệnh đọc bên trong sử dụng stdin và sử dụng một bộ mô tả tệp khác cho vòng lặp while

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

1

Nifle có nó chính xác. Tuy nhiên, khi bạn đang sử dụng nhiều thiết bị đầu cuối, bạn cần phải cụ thể.

Đối với những bạn đến từ google, xin chúc mừng bạn đã tìm thấy trang này. Nếu bạn cần phải làm bất cứ đầu vào người sử dụng trong một thời gian vòng lặp đọc (điều này bao gồm rm -i, readhoặc bất cứ điều gì khác), bạn có thể xác định các đường ống đầu vào để sử dụng.

Đây là một phần của giải pháp này mà tôi đã sử dụng:

#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

Cảm ơn Nifle! Và cũng nhờ bgStack. Sau khi tìm kiếm hàng giờ tôi cuối cùng đã có câu trả lời! Tuyệt vời !! Tôi đã sử dụng "echo $ (tty)" để phát hiện đường dẫn đầu cuối của mình hoặc bạn chỉ lấy nó làm biến. Đối với tôi đó là một trường hợp sử dụng khác. Bạn đang đọc một tập tin và muốn xác nhận việc thực hiện. Có lẽ ví dụ dưới đây giúp một số người khác.

#!/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

Trong trường hợp của tôi, tôi đã whileđọc từ một đường ống ... và sau đó tôi đã sử dụng chuyển hướng để đọc từ stdin : read something < %terminal.
erafthift0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.