상호 작용 중 대화형 명령의 출력 가져오기

상호 작용 중 대화형 명령의 출력 가져오기

나는 일반 텍스트나 HTML을 출력하는 사전 프로그램을 가지고 sdcv있으며 출력을 정규화하는 Bash 스크립트를 작성하여 sdcv일반 텍스트를 작성할 때 단순히 stdout을 인쇄하거나 lynxHTML을 출력할 때 형식이 지정된 HTML을 인쇄하는 데 사용합니다.sdcv

이를 위해 sdcv MYWORD | myscript.sh분석 결과를 파이프라인으로 전달할 수 있는 Bash 스크립트를 만들려고 합니다 sdcv. 문제는 sdcv두 개의 출력이 있고 첫 번째 출력을 기반으로 두 번째 출력의 형식을 지정해야 한다는 것입니다. 첫 번째 출력 후 sdcv사용자 입력이 필요하며 두 번째 출력이 인쇄됩니다.

을 사용해 보았지만 FIRST_OUTPUT=$(tee /dev/tty)문제는 이것이 sdcv요청의 첫 번째 출력 sdcvsdcv내 입력의 두 번째 출력을 병합하고 입력이 입력될 때까지 아무 것도 액세스할 수 없다는 것입니다.

어떻게 진행하나요?

답변1

<html...어쩌면 명령으로 시작하고 끝나는 일련의 행을 </html... 명령 으로 파이프할 수도 있습니다 lynx(또는 더 나은 방법도 있습니다 elinks) w3m.

좋다:

#! /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
}

관련 정보