如何解决cat/curl管道执行bash脚本时read命令不阻塞的问题
问题原因
当通过cat 脚本 | bash、curl 脚本地址 | bash这类管道方式执行脚本时,bash进程的标准输入被绑定到管道输出流而非当前终端(tty)。管道中仅传输脚本本身的代码内容,脚本加载完成后管道就会到达EOF状态,后续read命令尝试从标准输入读取内容时会直接拿到空值,不会触发阻塞等待用户输入的逻辑,因此出现循环空跑现象。
解决方案
有两种修改方式可选,按需使用即可:
- 方式1:仅调整需要交互的
read语句,显式指定从终端设备/dev/tty读取输入,修改internal_install.sh代码:
#!/usr/bin/env bash set -x while true; do read -p "Hello, what's your name? " name < /dev/tty echo $name done
- 方式2:调整父脚本调用逻辑,给整个内部脚本重定向输入源为终端,修改
install.sh代码:
#!/usr/bin/env bash ./internal_install.sh < /dev/tty
第二种方式更适合内部脚本中存在多处需要用户交互输入的场景,不需要逐一修改每条read语句。
修改后再通过管道方式执行脚本,read命令就可以正常阻塞等待用户输入了。
内容的提问来源于stack exchange,提问作者Tibor Takács
相关产品推荐
相关产品推荐

