REPL의 덤프 출력

REPL의 덤프 출력

저는 SML 프로그램을 작성하고 있으며 실제로 REPL을 실행하지 않고 REPL에서 프로그램을 실행하여 출력을 빠르게 확인할 수 있는 방법을 원합니다(프로그램에 구문 오류가 있는지 빠르게 확인하기 위해 - 저는 이것을 make로 사용할 계획입니다). vim 내부의 출력을 보기 위한 vim의 .sml 파일용 프로그램).. 현재 다음이 있습니다.

sml file.sml | echo -e "\004"

따라서 프로그램을 실행한 다음 Ctrl-D를 에코하여 REPL을 종료합니다. 문제는 Ctrl-D 키를 보내는 것이 너무 빨라서 출력이 없다는 것입니다. 나도 이것을 시도했다:

sml file.sml | sleep 2 ; echo -e "\004"

그런데 그것도 안 되고 있어요. REPL에서 출력 덤프를 얻는 방법에 대한 아이디어가 있습니까?

답변1

아니요, 문제는 파이프 작동 방식을 오해하고 있다는 것입니다.

Unix 파이프라인에서 데이터 흐름왼쪽에서 오른쪽으로(영어로 쓴 텍스트와 같은 방향) – 첫 번째 프로그램의 출력이 두 번째 프로그램의 입력이 됩니다. 그러나 파이프는 단방향입니다. 두 번째 프로그램의 출력은 첫 번째 프로그램으로 전송되지 않습니다.

당신이 달릴 때 sml file.sml | echo -e "\004", 당신은그렇지 않다Ctrl+D를 에 반영합니다 sml. 대신에 당신은파이핑 의 출력을 명령 sml으로echoecho– stdin을 사용하지 않기 때문에 폐기됩니다 .

  1. 키보드 → sml file.smlecho -e "\004"→ 화면

두 번째 시도인 sml file.sml | sleep 2 ; echo -e "\004"에도 비슷한 문제가 있습니다. 즉, 의 출력이 sml로 전송됩니다 sleep(수신한 입력도 삭제됨). 그러나 또 다른 문제가 있습니다. echo이제 명령은 파이프라인의 일부가 아닙니다. |보다 우선순위가 높다고 할 수 있습니다 ;. (당신은 할 수괄호를 사용한 그룹 명령; 예 a | (b; c; d))

  1. 키보드 → sml file.smlsleep 2→ 화면
  2. 키보드 → echo -e "\004"→ 화면

위에서 이미 말했듯이 두 시도 모두잘못된 방향. \004캐릭터를 로 보내려면 sml파이프라인을 다음과 같이 작성해야 합니다.

echo -e "\004" | sml file.sml

여기서 sml의 출력은 화면으로 이동해야 합니다.

있다또 다른 문제, 하지만. 당신도CtrlD키 누르기를 "입력 끝"과 혼동함이벤트.

"입력 끝"으로 의 변환은 CtrlD터미널 장치 계층에서만 발생합니다. 즉, 터미널 창에 Ctrl+D 문자를 입력할 때만 발생합니다. 그러나 echo -e "\004"파이프에 사용하는 경우에는~ 아니다자동으로 "입력 끝"으로 번역됩니다. 대신 실제 바이트 004[8진수]가 기록됩니다.

실제로 더 이상 입력이 없다고 프로그램에 알리고 싶다면 다음을 수행하십시오.아무것도 쓰지 마세요. 아무것도 출력하지 않는 명령을 사용하십시오. 예를 들어 , echo -n또는 파일 true에서 입력을 리디렉션하십시오 /dev/null.

echo -n | sml file.sml

sml file.sml < /dev/null

관련 정보