bash:嵌套的交互式读取在还使用read的循环内

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封装了上下文所致。

您能否建议如何解决此问题或其他机制?

eph*_*ent 5

您已正确确定原因是

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。