You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过管道将脚本传给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:15:06