파일에서 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.