终端带计时器程序需无延迟快速输入,现有方法失效求助
解决程序启动后无延迟输入已知内容的问题
我懂你遇到的麻烦了!你之前用./program; password的问题在于,分号;是等前一个命令完全退出后才执行下一个命令——也就是说,你的password命令是在程序已经结束之后才跑的,系统自然会提示“password不是命令”。而且如果程序的输出是定向到终端而非标准输出,普通管道可能也抓不到输出,这就导致你看不到耗时信息。
下面给你几个靠谱的解决方案,按场景选就行:
1. 最简单的方案:管道或Here字符串(适用于程序从标准输入读取的情况)
如果你的程序是从stdin(标准输入)读取内容,直接用管道把输入提前喂进去就行:
echo "your_password_here" | ./program
或者用更简洁的Here字符串语法:
./program <<< "your_password_here"
要是看不到程序输出,可能是输出跑到了标准错误流(stderr),可以把stderr重定向到stdout一起查看:
echo "your_password_here" | ./program 2>&1
2. 更可靠的方案:Expect脚本(适用于程序从终端读取的情况)
有些程序会直接读取终端设备(而不是stdin),这时候管道和Here字符串就不管用了——这时候得用expect工具来模拟终端交互,它能精准控制输入时机,还能保留程序的输出。
写一个简单的expect脚本:
#!/usr/bin/expect -f # 启动目标程序 spawn ./program # 这里可以根据程序的提示调整匹配规则,如果程序没有明确提示符,直接发送输入 expect { "Enter password:" { send "your_password_here\r" } # 如果有提示符就匹配这个 default { send "your_password_here\r" } # 没有的话直接发送 } # 保持交互,这样你就能看到程序的所有输出了 interact
保存为auto_input.exp,给它加执行权限:
chmod +x auto_input.exp
然后运行脚本就行:
./auto_input.exp
为什么之前的方法不行?
再帮你理清楚:
./program; password:分号是顺序执行,必须等./program完全退出,才会执行password,这时候程序已经不在运行了,根本接收不到输入。- 普通管道/Here字符串:如果程序是直接读取终端(比如用
getpass()这类函数),它会绕过stdin,所以这些方法就失效,这时候必须用expect模拟终端环境。
内容的提问来源于stack exchange,提问作者Chef
相关产品推荐
相关产品推荐

