
저는 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
으로echo
echo
– stdin을 사용하지 않기 때문에 폐기됩니다 .
- 키보드 →
sml file.sml
→echo -e "\004"
→ 화면
두 번째 시도인 sml file.sml | sleep 2 ; echo -e "\004"
에도 비슷한 문제가 있습니다. 즉, 의 출력이 sml
로 전송됩니다 sleep
(수신한 입력도 삭제됨). 그러나 또 다른 문제가 있습니다. echo
이제 명령은 파이프라인의 일부가 아닙니다. |
보다 우선순위가 높다고 할 수 있습니다 ;
. (당신은 할 수괄호를 사용한 그룹 명령; 예 a | (b; c; d)
)
- 키보드 →
sml file.sml
→sleep 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