Bash:在 while read 循环内读取输入不起作用

Bash:在 while read 循环内读取输入不起作用

在一段时间的读取循环内读取输入似乎不起作用

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

执行不会像读取在循环外那样暂停。为什么会这样?有没有在 while read 循环内读取输入的解决方法?

答案1

问题在于和都read line需要read response(并获取)来自的数据stdin
这个问题在 SO 上对其中的一些内容进行了解释,并提供了更多信息的链接。

总结
接受的答案建议:

从控制终端设备读取:read input </dev/tty

答案2

让内部读取命令使用 stdin,并为 while 循环使用不同的文件描述符

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

答案3

感谢 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

答案4

Nifle 的说法完全正确。但是,当您使用多个终端时,您需要具体说明。

对于那些来自谷歌的人来说,恭喜你找到了这个页面。如果你需要在一段时间的读取循环期间进行任何用户输入(这包括rm -iread或其他任何内容),你可以指定要使用的输入管道。

这是我使用的该解决方案的一部分:

#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

相关内容