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

如何在freopen()后通过Bash分两次重定向程序的stdin输入?

解决方法

核心思路是利用**伪终端(PTY)**模拟程序的终端输入,让freopen("/dev/tty")指向我们提供的菜单文件,而非真实终端。以下是几种通用方案:

方案1:使用script命令(最通用,无需额外工具)

script命令会创建一个伪终端,让程序运行在该终端环境中,同时我们可以将菜单文件作为script的输入,替代真实终端的交互:

script -q /dev/null -c './your_program < longInput.txt' < menu.txt

解释:

  • -q /dev/null:让script静默运行,不生成日志文件
  • -c './your_program < longInput.txt':指定要运行的程序,同时将longInput.txt重定向为程序的初始stdin
  • < menu.txt:将菜单文件作为script的stdin,当程序调用freopen("/dev/tty")后,会从这个输入读取菜单选项

方案2:使用expect脚本(适合更复杂的交互场景)

如果需要更精细控制输入时机,可以用expect脚本模拟终端交互:

#!/usr/bin/expect
# 启动程序并将初始stdin指向longInput.txt
spawn ./your_program < longInput.txt
# 等待程序完成初始输入读取,进入菜单交互阶段
# 根据程序实际输出调整匹配规则,比如程序输出"请选择菜单:"时发送文件内容
expect "请选择菜单:"
# 将menu.txt的内容发送给程序
send_file "menu.txt"
# 保持交互(如果需要后续手动操作)
interact

保存为feed_input.exp,赋予执行权限后运行:

chmod +x feed_input.exp
./feed_input.exp

方案3:使用pty工具(部分系统预装)

如果系统有pty工具,可以直接指定菜单文件作为终端输入:

pty -w menu.txt ./your_program < longInput.txt

关键原理

程序调用freopen("/dev/tty")时,会尝试连接当前进程的控制终端。通过伪终端工具(script/expect/pty),我们可以替换这个控制终端的输入源为菜单文件,从而实现不修改源码的情况下,将第二个文件定向为程序的终端输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:23:15