파일에서 stdin을 가져 오지만 여전히 터미널에 표시됩니다.


9

프로그램이 실행될 때 데이터를 입력 해야하는 프로그램이 있습니다. 다음과 같이 상상해보십시오.

$ ./program
Hi there. What's your name? Zambezi
What is your quest? To make a program which runs nicely
What is your favourite color? Red
...

이제 프로그램을 실행할 수있는 많은 테스트 입력이 있습니다. 그들은 모두 다음과 같은 것을 포함합니다 :

Arthur, King of the Britons
To seek the Holy Grail
...

그러나 일부 테스트 스크립트는 실패하지만 불행히도 터미널이 다음과 같이 오류가 발생한 위치를 정확하게 해독하기가 매우 어렵습니다.

$ ./program < arthur.txt
Hi there. What's your name?What is your quest?What is your favourite color?...

여전히 stdin파일 을 통해 입력을 줄 수 있지만 터미널을 마치 모두 입력 한 것처럼 표시되도록 할 수 있습니까?

중요한 것은 Linux Mint 16입니다.


이 작업을 수행하는 방법을 모르지만 (버퍼가없는) tty 장치를 사용하여이 작업을 수행 할 수 있어야합니다. 단서에 대해서는 stackoverflow.com/questions/8514735/… 를 참조하십시오 .
Joe

답변:


13

프로그램에 입력을 버퍼링하는 입력 리디렉션 (./program <arthur.txt)을 사용하는 대신 "예상"과 같은 도구를 사용하여 질문을 기다렸다가 하나씩 답변을 보내야합니다.

#!/usr/bin/expect
log_user 0
spawn ./program
log_user 1

expect {
  "*?"
}
send "Arthur, King of the Britons\r"

expect {
  "*?"
}
send "To seek the Holy Grail\r"

expect {
  "*?"
}
send "...\r"

더 좋은 예 : http://www.pantz.org/software/expect/expect_examples_and_tips.html


위의 작업이 완료되면 expect프로그램 문제를 알리고 "좋아하는 색은 무엇입니까?" 질문 — 그런 다음 expect스크립트에서 arthur.txt파일 (또는 다른 지정되고 적절하게 구조화 된 파일)을 읽어 해당 입력을 스크립트에 하드 코딩하지 않고 입력하도록합니다.
G-Man, 'Reinstate

7

이것이 정확히 tee사용되는 것입니다.

예를 들면 다음과 같습니다.

$  echo foo | tee >( grep bar ) 
foo
$

여기에서 일어나는 일은 티딘이 stdin을 가져 와서 stdout에 복사하여 다시 파이프하는 것입니다. 파이프 조인트처럼.

자세한 내용은 맨 페이지 tee (1)를 확인하십시오.


1
그래도 메시지가 올바른 순서로 표시됩니까? 버퍼링을 무시하더라도이 프로그램은 본질적으로 동시에 실행되고 동일한 화면에 쓰려고하는 두 프로그램입니다.
Federico Poloni 2016 년

1
그래도 시나리오에서 이것을 어떻게 사용합니까? 맨 페이지를 읽으려고했지만이 도구에는 내 유스 케이스보다 훨씬 더 많은 것 같습니다 . program.exe그리고 and에 관해서는 어떻게 사용하는지 알지 못했습니다 arthur.txt.
Zambezi

@Zambezicat arthur.txt | tee >( program.exe )
gronostaj

2
티도 가장 먼저 떠 올랐습니다. 그러나 나는 그것을 시도하고 작동하지 않는 것을 확인했다. 출력이 별도로 표시됩니다. 내 실험에서 arthur.txt의 내용이 먼저 표시되고 program.exe의 질문이 표시됩니다. 당신은 그것을 "언 버퍼"의 기대로 작동시킬 수는 있지만 운이 없었습니다.
일부 사용자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.