包装程序并有条件地传递输入和输出

问题描述

我正在尝试为位于父进程与其子进程之间并在它们之间传递stdin,stdout和stderr的程序创建包装脚本。 我很乐意使用bash,expect或任何其他合适的工具。

我的要求是:

  • 将stdin从父级传递到子级-在适当的时候对其进行修改
  • 将标准输出从子级传回父级-在适当的时候对其进行修改
  • 将stderr从孩子传递回父母

目的是在引擎盖下使用真实子进程的同时模拟子进程的某些故障模式。

期望似乎是显而易见的选择,但是我很难找到比基本文档更多的东西(有一个scan of exploring expect online,但它不可搜索)。 到目前为止,我有类似以下内容

#!expect
log_file expect.log
spawn -noecho <mychild process>
trap {send "quit\n"} SIGTERM
#interact -o { "param" { puts "foobar" } }

expect_background {
  -re "output from child program 1" { 
      puts "some other output instead" 
      # no error reported but seems to be a null-op / ignored error
      puts $expect_out(1,string)
      #okay - in a loop
      break 
  }
}
interact {
  -re "input from parent" { 
      puts "some input" 
      uplevel 0 { puts [ info vars ] }
# no such var
#      puts $interact_out(1,string)  
# not in a loop
#      break 
   }
}

我实际上想使用interact -o来更改发送回父级的子进程的输出,但是我无法理解语法。因此,我改用expect_background

  1. 此处正确的语法是什么?

  2. 如何从交互块中访问匹配的文本?

    man page说我可以使用expect_outinteract_out,但是只有在expectinteract命令完成后才能使用。 expect_outinteract_out不能通过info vars列出,它们是什么? 我认为它们是正则表达式匹配项,并且仅在使用-re时可用,但这尚不明确(尝试时似乎不起作用)。

  3. 我可以在break中使用expect_background,但不能在interact中使用。我可以用什么来突破它?

  4. 奖金:我可以将输入,输出和stderr错误记录到不同的文件中,以作为使用log_file的改进吗?

  5. 或者我如何获得相同的原始bash?

我在那里错过了更好的文档吗?还是他们那里有一些现代或更完善的替代方案?我知道pexpect。我不确定它的“ interact”是否和最初的预期一样先进(基于此What can Expect do that Pexpect can not do?)。

我研究得越多,就越倾向于用C ++或python编写自己的单一用途包装器。我正在这里寻找可以避免这种麻烦的快速修复方法

根据CLI提示,我似乎正在使用Expect1.1,但apt信息显示:“版本:5.45.4-2build”

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)