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

如何为Shell脚本传递部分用户输入,其余输入保留交互提示?

解决Shell脚本部分输入预填、后续交互的问题

你遇到的问题是因为管道把脚本的**标准输入(stdin)**完全接管了——第一个read读完管道里的foo后,管道就空了,第二个read没东西可读直接退出,自然不会提示输入。

给你两个可行的解决办法:

办法一:修改脚本,指定后续read从终端读取

直接在需要终端交互的read命令后加上< /dev/tty,强制它从终端设备读取输入,不受脚本stdin的影响。

修改后的脚本:

echo "thing 1?"
read input1
echo $input1

echo "thing 2?"
read input2 < /dev/tty
echo $input2

调用方式不变:

printf "foo\n" | sh myscript.sh

这样第一个输入会自动填充为foo,第二个read会正常在终端弹出提示,等待你手动输入。

办法二:不修改脚本,调整调用命令

用子进程先输出预填的第一个输入,再用cat把终端的输入转发给脚本的stdin:

(printf "foo\n"; cat) | sh myscript.sh

原理是:子进程先把foo\n写入管道,之后cat会持续读取你的终端输入并传给管道,脚本的第二个read就能拿到你手动输入的内容,正常完成交互。

内容的提问来源于stack exchange,提问作者Rosey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:12:32