通过管道将脚本传给bash执行时如何读取用户交互输入
问题原因
当你通过cat 脚本路径 | bash的方式执行脚本时,bash进程的标准输入(stdin)已经被绑定到管道的输出流,用来接收前面cat命令传递的脚本内容,默认read命令会从stdin读取内容,此时管道已经没有多余内容可读,因此会直接跳过输入步骤。你之前尝试添加--参数无法解决问题,因为该参数的作用是停止bash后续的命令行参数解析,和标准输入的来源无关。
解决方案
直接修改脚本中的read相关逻辑,明确指定从当前交互终端/dev/tty读取输入即可,不需要调整bash启动参数。
方案1:单条read指定读取源
仅针对需要读取用户输入的单条read语句指定输入源,修改你示例中的对应行即可:
read -p " [*] Press enter to acknowledge and continue..." < /dev/tty
方案2:批量重定向输入源
如果脚本中有多处需要读取用户输入的逻辑,可以在第一次需要读取输入前添加重定向规则,后续所有read都会默认从终端读取,不需要每条单独配置:
# 执行到需要交互的逻辑前,将标准输入重定向到终端 exec < /dev/tty # 后续的read不需要额外加参数即可正常读取用户输入 read -p " [*] Press enter to acknowledge and continue..." # 其他交互逻辑可以正常写
兼容非交互场景
如果你的脚本可能需要在无终端的非交互环境(比如CI流水线、后台执行)中运行,可以增加终端存在性判断,避免脚本无意义卡住:
# 判断当前是否为交互终端环境 if [ -t 0 ]; then read -p " [*] Press enter to acknowledge and continue..." < /dev/tty fi
内容的提问来源于stack exchange,提问作者LewlSauce
相关产品推荐
相关产品推荐

