如何通过URL交互式运行bash脚本 解决管道执行无交互提示问题
管道/远程执行bash脚本无法触发交互提示的解决方法
问题根因
当使用命令 | bash的管道形式执行脚本时,bash进程的标准输入被绑定到管道的数据流(即curl/wget输出的脚本内容),而非当前交互终端(/dev/tty)。脚本中的read语句默认从标准输入读取内容,管道内的脚本内容读取完成后会直接返回EOF,因此不会等待用户输入,也不会输出交互提示。
解决方案
方案1:修改脚本(兼容性最好,推荐)
将脚本中需要读取用户输入的read语句指定输入源为/dev/tty,强制从当前终端读取输入:
把原语句read -p "Press enter to continue"
替换为read -p "Press enter to continue" < /dev/tty
修改后无论是本地管道执行、直接执行,还是远程curl/wget管道执行,都可以正常弹出交互提示,等待用户输入。
方案2:不修改脚本,调整执行命令
使用进程替换的方式执行远程脚本,让bash的标准输入保留为终端即可:
# curl 执行方式 bash <(curl -s myhost.com/myscript.sh) # wget 执行方式 bash <(wget -q myhost.com/myscript.sh -O -)
该方案通过进程替换的特殊文件描述符把远程脚本内容传给bash读取,bash本身的标准输入仍然绑定终端,因此脚本内原生的read语句可以正常触发交互。
内容的提问来源于stack exchange,提问作者draca
相关产品推荐
相关产品推荐

