리디렉션된 입력 및 출력을 사용하여 프로그램 로깅 캡처

리디렉션된 입력 및 출력을 사용하여 프로그램 로깅 캡처

내가 작성하는 프로그램의 일반적인 상호 작용은 다음과 같습니다.

Enter command: a_command
Completed a command

Enter command: another_command
Completed another command

./program < input.txt나는 보통 다음을 포함 하는 프로그램을 실행합니다 input.txt.

a_command
another_command

나는 위와 같이 (출력뿐만 아니라) 전체 상호 작용을 캡처할 수 있기를 원합니다. Bash를 사용하여 이 작업을 어떻게 수행할 수 있나요?

편집: programbash 스크립트가 아닌 바이너리 파일(구체적으로 C++로 작성됨)입니다. 소스 코드에 액세스할 수 있지만 소스 코드를 수정하지 않고 이 작업을 수행하고 싶습니다.

답변1

해당 프롬프트 다음에 입력을 인쇄하려면 프로그램이 입력을 기다리는 시간을 알아야 합니다. 실행 중인 프로그램을 보면 차이점을 알 수 없습니다. stdin에서 입력을 기다리는 프로그램과 다른 것(네트워크, 디스크, 컴퓨팅 등)을 기다리는 프로그램 간의 차이를 알 수 없습니다.

따라서 대화형 사용을 위한 레코드처럼 보이는 것을 얻는 프로세스는 다음과 같아야 합니다.

  • 프로그램 시작.
  • 기다렸다가 첫 번째 프롬프트를 인식하십시오.
  • 입력을 표시하고 첫 번째 프롬프트로 보냅니다.
  • 두 번째 입력 프롬프트와 이후의 모든 입력 프롬프트도 마찬가지입니다.
  • 프로그램이 종료되면 종료합니다.

이 스크립트를 작성하기 위한 사실상의 표준 도구는 다음과 같습니다.예상되는. 스크립트는 다음과 같습니다(경고: 작동하지 않는 코드, 브라우저에 직접 입력).

#!/usr/bin/expect -f
set transcript_file [open "transcript" wb]
spawn myprogram
expect "Enter command:"
puts -nonewline $transcript_file $expect_out(buffer)
send "a_command\r"
puts -nonewline $transcript_file "a_command\r"
puts -nonewline $transcript_file $expect_out(buffer)
send "another_command\r"
puts -nonewline $transcript_file "another_command\r"
puts -nonewline $transcript_file $expect_out(buffer)
expect eof
close $transcript_file

답변2

set -x프로그램 파일에 이 줄을 추가합니다.

예:

#!/bin/bash
set -x #echo on

ls $PWD

그러면 명령이 출력되기 전에 모든 변수가 확장되고 전체 명령이 인쇄됩니다.

산출:

+ ls /home/user/
file1.txt file2.txt

확인하다이 답변Stackoverflow에서 더 유사한 설정 명령 플래그를 가져옵니다.

관련 정보