在一段时间的读取循环内读取输入似乎不起作用
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 -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