MacOS의 script 명령에서 창 크기를 인식하지 못하는 오류가 발생했습니다.

개시하다


이 오류는 MacOS(BSD) 상황에서만 발생합니다.GNU/Linux(Ubuntu 등)에서는 이 오류가 발생하지 않았습니다.

script 명령 정보


UNIX에 script라는 명령이 설치되어 있습니다.이것은 터미널의 출력을 파일에 출력하여 기록하는 것이다.
Shell
script
이렇게 하면 케이스가 작동합니다.여기서부터 터미널의 출력이 기록됩니다.
Shell
exit
명령의 하위 케이스script를 통과할 때 명령을 실행하기 전의 현재 디렉터리에 파일을 생성합니다script.
이 파일에는 명령 실행에서 끝까지의 터미널 출력[1]이 기록되어 있다.

장점


터미널 출력을 파일에 기록하는 장점은 다음과 같다.
  • 터미널의 최대 출력 줄 수를 초과하여 터미널에서 사라진 기록을 보고 싶을 때
  • 탭을 닫은 로그를 보고 싶을 때
  • 텍스트 편집기 등을 통해 대량의 출력에 묻힌 특정한 로그를 검색하려면
  • 이러한 장점 때문에 개인적으로 단말기의 출력은 항상 미리 기록하려고 하지만 맥OStypescript 명령은 창 크기를 식별하지 못하는 오류가 있다.

    확인


    정상 시스템


    우선 명령을 실행하기 전의 창 크기를 확인하십시오.script 명령이나 script 명령을 사용하면 터미널의 창 크기를 얻을 수 있습니다.
    명령하다
    얻을 수 있는 정보script너비tput수직 너비stty수직 너비
    Shell
    stty size
    41 178
    
    그런 다음 터미널의 창 크기를 변경하고 같은 명령을 다시 실행합니다.
    Shell
    stty size
    32 134
    
    창의 크기를 조금 줄여 보았지만 잘 반영되었다.

    tput cols 명령을 실행할 때


    이어서 tput lines 명령을 집행한다.
    Shell
    script
    
    그리고 창 크기를 가져옵니다.
    Shell
    stty size
    32 134
    
    이 상태에서 창 크기를 변경하고 같은 명령을 다시 실행합니다.
    Shell
    stty size
    32 134
    
    창의 크기를 확대하려고 했지만 수치가 반영되지 않았다.

    문제점

    stty size 명령이나 script 명령의 수치만 반영하지 않았다면 아무런 문제가 없었지만 부작용이 있었다.
    예를 들어 script,tput,stty 등이 호출기를 시작하는 명령을 실행할 때 고장이 발생한 것으로 나타났다.
    가로와 세로가 올바르게 인식되지 않아 폴딩이 비활성화된 경우에도 폴딩(가로)이 발생하고 수직으로 스크롤하면 이전 디스플레이가 붙여져 디스플레이가 뒤죽박죽이 됩니다(세로).

    GNU 설치 불가


    BSD 구현less 명령에 오류가 있으면 GNU 구현을 MacOS에 설치하면 되잖아요.실제로 저자는 GNU로 구현된 명령vim과 명령man을 맥OS에 설치해 사용했다.
    그러나 유감스럽게도 명령script과 관련해서는 맥OS에 GNU 실현 방안을 설치할 수 없다.

    해결책


    터미널 창 크기에 따라 명령 실행

    ls 명령으로 정확한 가로와 세로 폭을 알려주면 정상적인 행동을 회복할 수 있다.
    Shell
    stty rows <縦幅> cols <横幅>
    
    그러나 창의 크기를 조정할 때마다 가로와 세로를 검사해야 하기 때문에 상술한 명령을 실행하는 것은 매우 번거롭다.

    창 크기 조정 안 함


    이전에도 이렇게 대응하는 경우가 있었지만 창의 크기를 중간에 바꾸지 못하는 것은 불편했다.

    iTerm2 기능 사용


    iTerm2에서는 명령을 사용하지 않더라도 터미널의 출력을 파일에 기록하도록 설정하는 기능을 실현했다.grep->script->stty->script에서 목적지를 저장하는 경로를 지정하면 출력 파일이 이 디렉터리에 저장됩니다.

    체크Profiles를 하면 회피 시퀀스 등이 제외됩니다.도피 순서가 있으면 보기 어려우니 미리 확인해 보는 것이 좋다.
    그러나 이는 iTerm2일 뿐 다른 터미널 애플리케이션(Terminal.app와 VS 코드의 터미널 기능 등)에는 적용되지 않는다.
    필자는 최근 시작하는 앱을 줄이기 위해 VS 코드의 터미널을 사용하려 했으나 출력을 기록할 수 없어 두 번째 단계를 밟았다.
    뭐 좋은 해결책 있어요?

    참고 자료

  • BSD script command prevents a terminal from recognizing its size. How can I fix this?
  • Delete code related to recording
  • 각주
    선택하지 않은 경우Session 파일이 생성됩니다.또한 이미 존재하는 파일Miscellaneous의 경우 덮어씁니다.출력하고 바로 파일로 출력하는 옵션도 있고, 덮어쓰기가 아니라 추가적인 옵션도 있지만, 생략합니다.자세한 내용은 Automatically log session input to files in를 참조하십시오.↩︎

    좋은 웹페이지 즐겨찾기