입력된 모든 입력 및 제어 문자를 캡처하지 않고 대화형 입력 및 출력 로깅

입력된 모든 입력 및 제어 문자를 캡처하지 않고 대화형 입력 및 출력 로깅

대화형 명령줄 프로그램의 출력을 기록하려고 합니다.units, 구체적으로.

나는 tee 다음과 같이 사용해 보았습니다.

units | tee units.log

또는 다음과 같은 스크립트:

script -c units units.log

그러나 둘 다 다음과 같이 모든 백스페이스와 탭 완성을 특수 문자로 기록합니다.

You have: 55 horsepower ^G/^H^[[K^M
You want: wat^Gt ^M
    * 41013.493^M
    / 2.438222e-05^M

맨페이지에 script이 문제가 언급되어 있습니다.

실수

스크립트는 줄 바꿈 및 백스페이스를 포함하여 모든 것을 로그 파일에 넣습니다. 이것은 순진한 사용자가 기대하는 것이 아닙니다.

아래 설명된 대로 이스케이프 문자를 사용 cat하거나 제거하여 more파일을 보는 해결 방법을 알고 있습니다 .col

https://stackoverflow.com/questions/7152339/format-output-from-unix-script-command-remove-backspaces-linefeeds-and-delet

Perl 스크립트는 다음과 같습니다.

http://log.guidoderosa.net/2009/05/another-old-post-which-may-be-useful.html

그러나 나는 특별히 기존 로그 파일을 수정하고 싶지 않습니다. 삭제된 입력 및 제어 문자로 왜곡된 새 로그 파일을 생성하는 것을 피하고 싶습니다.

readline을 사용하여 문제를 해결했다고 생각했는데 readline 기능과 충돌 rlwrap하여 units출력을 캡처하지 못하거나 출력을 캡처하지만 rlwrap -a탭 완성 기능을 무효화합니다. 도움이 안돼. 이것은 매뉴얼 페이지에 잘 설명되어 있습니다:unitsrlwrap -a -N

버그 및 제한 사항

rlwrap은 유연하고, 제품(readline 기능)을 전달하고, Unix의 "많은 작은 도구" 패러다임을 따르지만 이는 패치워크입니다. 명령의 내부 상태에 대해 아무것도 배울 수 없으므로 상황에 맞는 완성이 불가능합니다. 명령에서 readline 라이브러리를 사용하는 것이 여전히 최선의 선택입니다.

기존 기능을 방해하지 않고 대화형 입력 및 출력을 깔끔하게 기록할 수 있는 방법이 있습니까 readline?

업데이트: 비슷한 것이 있으면 좋겠습니다.

units | col -b | tee units.log

그러나 대화형 입력을 기다리는 동안 중단됩니다. 이 문제가 해결될 수 있습니까?

답변1

GNU Units는 최근 버전 2.10에 이 기능을 추가했습니다.

--log옵션을 사용하면 계산 결과를 파일에 저장할 수 있습니다. 이는 작업을 영구적으로 기록해야 하는 경우 유용합니다.

https://www.gnu.org/software/units/manual/units.html#Logging-계산

관련 정보