如何为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
相关产品推荐
相关产品推荐

