在交互过程中获取交互命令的输出

在交互过程中获取交互命令的输出

我有一个字典程序,sdcv它输出普通文本或 HTML,并且我正在编写一个 Bash 脚本来规范化输出,以便它在sdcv编写普通文本时简单地打印 stdout,或者在输出 HTMLlynx时使用它打印格式化的 HTML。sdcv

为此,我正在尝试制作一个可以通过管道传输的 Bash 脚本,sdcv MYWORD | myscript.sh该脚本将分析sdcv的输出。问题是sdcv有两个输出,我需要在第一个输出的基础上格式化第二个输出。第一次输出后,sdcv需要用户输入,然后打印第二次输出。

我尝试过使用FIRST_OUTPUT=$(tee /dev/tty),但问题是这合并了sdcv的第一个输出、sdcvsdcv的第二个输出请求的我的输入,并且在输入输入之前我无法访问任何内容。

我该如何继续?

答案1

<html...也许您可以将以该命令开头和结尾的行序列通过管道传输到</html... 该命令lynx(或者可能更好elinksw3m)。

喜欢:

#! /usr/bin/perl
while (<<>>) {
  if (!$inhtml && m{<html}i) {
    $inhtml = 1;
    open HTML, "|-", qw(elinks -dump);
  }

  print {$inhtml ? HTML : STDOUT}  $_;

  if ($inhtml && m{</html}i) {
    close HTML;
    $inhtml = 0;
  }
}

(和sdcv MYWORD | that-script

答案2

这对我来说结束了工作,答案是一段痛苦的期待之旅。我毫不怀疑这段代码还有改进的空间,所以请随时留下您的建议!

#!/usr/bin/expect -f

set arg1 [lindex $argv 0]
spawn sdcv $arg1

expect "Found*" {

    expect "Your choice*" {
        expect_user -re "(.*)\n"

        set user_input $expect_out(0,string)
        send "$user_input\r"

        expect "#"
        set output $expect_out(buffer)

        set command "echo \"$output\" | lynx --dump --stdin"

        spawn bash
        expect "*"

        send "$command\r"
        expect "$command\r\n"

        expect eof
    }

    #for some reason gets saved to expect_out(0,string) when we input a word with a single match
    set output $expect_out(0,string)
    set command "echo \"$output\" | lynx --dump --stdin"

    spawn bash

    send "$command\r"
    expect "$command\r\n"

    expect eof
}

相关内容