Tho*_*sen 4 bash interactive while-loop
在while循环中,如何编写交互式响应?
#!/bin/bash
shows=$(< ${HOME}/.get_iplayer/tv.cache)
# ...
# ... stuff with shows omitted ...
# ...
function print_show {
# ...
return
}
while read -r line
do
print_show "$line"
read -n 1 -p "do stuff? [y/n] : " resp # PROBLEM
# ...
# resp actions omitted
# ...
done <<< "$shows"
Run Code Online (Sandbox Code Playgroud)
因此,读取文件,进行“处理”,然后将所得的面向行的数据用于while read循环中
但是while循环中的读取行无法按预期工作,也就是说,它没有等待用户响应,这可能是由于while read封装了上下文所致。
您能否建议如何解决此问题或其他机制?
您已正确确定原因是
while ...; do ...; done <<< "$shows"
Run Code Online (Sandbox Code Playgroud)
循环中,stdin已被重定向,因此read不再从键盘读取。
您可以通过使用非0的文件描述符来解决此问题;例如,
while read -r -u 3 line; do ...; done 3<${HOME}/.get_iplayer/tv.cache
Run Code Online (Sandbox Code Playgroud)
将对该文件使用FD 3而不是FD 0,从而允许普通对象read(不带-u)使用原始stdin,或者
while ...; do read -n 1 -p "do stuff? [y/n] : " -u 3 resp; done 3<&0 <<< "$shows"
Run Code Online (Sandbox Code Playgroud)
在用字符串替换FD 0之前将原始FD 0克隆到FD 3。
| 归档时间: |
|
| 查看次数: |
2561 次 |
| 最近记录: |