Shell脚本按序执行命令:向启动进程输入指令并存储输出
在Shell脚本中处理交互式进程的输入与输出捕获
针对你需要启动myapp进程,依次传入input_1、input_2并分别捕获对应输出output_1、output_2的需求,以下是几种实用方案:
方案1:标准输入传递+输出拆分(适合无提示符的简单程序)
如果myapp仅从标准输入读取内容,且每次输入后直接输出结果到标准输出,可通过printf批量传入输入,再拆分捕获的完整输出:
# 执行myapp并传入两次输入,捕获全部输出 full_output=$(printf "%s\n%s\n" "input_1" "input_2" | myapp) # 根据实际输出结构提取output_1和output_2,示例假设输出按行分隔 output_1=$(echo "$full_output" | sed -n '1p') output_2=$(echo "$full_output" | sed -n '2p') # 将结果写入文件存储 echo "$output_1" > output1.txt echo "$output_2" > output2.txt
方案2:使用expect处理交互式程序(适合带提示符的场景)
如果myapp启动后需要等待特定提示符(如>)才接受输入,expect工具能精准控制交互流程:
首先确保系统已安装expect,然后编写脚本(命名为interact.exp):
#!/usr/bin/expect # 启动目标进程 spawn myapp # 等待程序的输入提示符(需替换为myapp实际的提示符,示例为"> ") expect "> " # 发送第一个输入 send "input_1\r" # 捕获第一个输出(匹配到下一个提示符前的内容) expect -re "(.*)\r\n> " set output_1 $expect_out(1,string) # 发送第二个输入 send "input_2\r" # 捕获第二个输出(匹配到程序结束前的内容) expect -re "(.*)\r\n" set output_2 $expect_out(1,string) # 发送退出指令(根据myapp实际退出命令调整) send "exit\r" expect eof # 将结果写入文件 set f [open "output1.txt" w] puts $f $output_1 close $f set f [open "output2.txt" w] puts $f $output_2 close $f
给脚本添加执行权限并运行:
chmod +x interact.exp ./interact.exp
方案3:命名管道(FIFO)实现双向通信
通过创建命名管道分离输入和输出流,可实现更灵活的进程交互:
# 创建两个命名管道,分别用于输入和输出 mkfifo myapp_input myapp_output # 后台启动myapp,绑定输入输出管道 myapp < myapp_input > myapp_output & myapp_pid=$! # 从输出管道读取结果,存储到变量 { read output_1 read output_2 } < myapp_output # 向输入管道发送两次输入 echo "input_1" > myapp_input echo "input_2" > myapp_input # 等待进程结束,清理管道 wait $myapp_pid rm myapp_input myapp_output # 保存结果到文件 echo "$output_1" > output1.txt echo "$output_2" > output2.txt
注意:此方案要求myapp每次输入后输出单行结果,否则需调整read逻辑适配输出格式。
内容的提问来源于stack exchange,提问作者gambit
相关产品推荐
相关产品推荐

