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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:00:27