対話中の対話型コマンドの出力の取得

対話中の対話型コマンドの出力の取得

私はプレーンテキストまたはHTMLを出力する辞書プログラムを持っており、出力を正規化するsdcvBashスクリプトを書いてプレーンテキストをsdcv書くときに単にstdoutを印刷するか、lynxHTMLを出力するときにフォーマットされたHTMLを印刷するために使用します。sdcv

そのために、sdcv MYWORD | myscript.sh分析結果をパイプラインに渡すことができるBashスクリプトを作成しようとしていますsdcv。問題は、sdcv2つの出力があり、最初の出力に基づいて2番目の出力をフォーマットする必要があることです。最初の出力後にsdcvユーザー入力が必要で、2番目の出力が印刷されます。

私は試してみましたが、FIRST_OUTPUT=$(tee /dev/tty)問題はこれがsdcv要求の最初の出力sdcvsdcv私の入力の2番目の出力をマージし、入力が入力されるまで何もアクセスできないことです。

どうやって進めますか?

答え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
}

関連情報