크기 조정 가능한 직렬 콘솔 창? 성가신 일입니다. 일반적으로을 사용하여 콘솔에

내 시스템의 시리얼 콘솔을 사용할 때 항상 $COLUMNS=80및로 끝나게됩니다 $LINES=24.

이 변수를 수동으로 변경할 수는 있지만 클라이언트 쪽 터미널 창의 크기가 조정될 때마다이 작업을 수행하는 것은 다소 성가신 일입니다.

일반적으로을 사용하여 콘솔에 연결합니다 screen /dev/mytty baudrate.

변화하는 $TERM“화면”또는 “xterm 등”에 환경 변수를하는 것은 도움이되지 않습니다.

gettyvt100 대신 그 중 일부와 통화해야 합니까?

ssh를 사용하여 동일한 컴퓨터에 연결할 때이 모든 것이 잘 작동한다는 것은 말할 필요도 없습니다.



답변

앞서 언급 한 주석가들과 마찬가지로 resize모든 명령 을 호출하는 것에 대한 대안은 없습니다 . 만약이 명령이없고 패키지가 ( xterm) 안에있는 패키지를 설치하고 싶지 않다면 다음과 같은 두 가지 POSIX 쉘 스크립트가 있습니다. ANSI 터미널 이스케이프 코드 사용 :

res() {

  old=$(stty -g)
  stty raw -echo min 0 time 5

  printf '\0337\033[r\033[999;999H\033[6n\0338' > /dev/tty
  IFS='[;R' read -r _ rows cols _ < /dev/tty

  stty "$old"

  # echo "cols:$cols"
  # echo "rows:$rows"
  stty cols "$cols" rows "$rows"
}

res2() {

  old=$(stty -g)
  stty raw -echo min 0 time 5

  printf '\033[18t' > /dev/tty
  IFS=';t' read -r _ rows cols _ < /dev/tty

  stty "$old"

  # echo "cols:$cols"
  # echo "rows:$rows"
  stty cols "$cols" rows "$rows"
}

BTW, 내 .profile파일에서 다음을 찾을 수 있습니다.
[ $(tty) = /dev/ttyS0 ] && res
따라서 터미널 크기는 직렬 라인 (관리에 사용하는)을 통한 모든 로그인에서 결정됩니다 (예 : 장치를 재부팅 한 후). 주석에서 rsaw
의 아이디어를 참조 하여 줄을 바꾸 십시오. [ $(tty) = /dev/ttyS0 ] && trap res2 DEBUG따라서 모든 명령 후에 크기 조정이 실행됩니다 (AFAIK는 항상 가능하지는 않지만 항상 가능하지는 않습니다 busybox).


답변

기록을 위해이 문제에 대한 답은 다음과 같습니다 (유즈넷 원).

가상 터미널 응용 프로그램 (내부에서 실행되는 콘솔 응용 프로그램 xterm, rxvt그리고 친구) 받게됩니다 SIGWINCH크기 조정 작업이 발생한 후. 따라서 응용 프로그램은 해당 신호 처리기에서 창 등을 다시 그릴 수 있습니다.

불행히도 시리얼 콘솔을 사용할 때는 그러한 메커니즘이 없습니다.

그러나 응용 프로그램이 현재 콘솔 창 크기 를 적극적으로 요청할 수 있습니다. 따라서 두 번째 가장 좋은 방법은 명령 프롬프트가 셸에 의해 인쇄 될 때마다이 작업을 수행하는 것입니다.

먼저 특수 크기 조정 실행 파일을 컴파일하면됩니다. 후 다음을 사용하면됩니다 bashrc.

if [ $(tty) == '/dev/ttyS0' ]; then
  trap resize DEBUG
fi

물론 이것은 런타임 동안 콘솔 응용 프로그램의 콘솔 크기 설정을 변경하지 않습니다.


답변

예컨대 “크기 변경”단자 NAWS의 결과 ( Negotiate About Window Size부터 RFC 1073 텔넷 윈도우 크기 옵션 ).

직렬 포트를 사용하여 컴퓨터에 직접 연결된 경우 협상이 필요 없으며 컴퓨터의 터미널 화면 크기에 대한 직접적인 지식이 없습니다.

단말기가 크기를 협상 할 수있는 경우 컴퓨터는 SIGWINCH단말기에서 실행중인 응용 프로그램으로 화면 크기 개념을 업데이트하도록 지시합니다.

컴퓨터가 화면 크기를 모르는 경우 일반적으로 stty -a(행과 열)로 표시되는 크기 를 0 으로 설정합니다 . 대화 형 사용의 경우,이 조금 쌀쌀하고, 일부 시스템 환경 변수 사용 LINESCOLUMNS지원에 있습니다. 할당 된 값 은 터미널 설명에서 파생 될 수 있습니다. 더 자주 그들은 단순히 하드 코딩됩니다. 이러한 변수에 대한 규칙은 예를 들어 curses 응용 프로그램에서 명시 적으로 억제되지 않는 한 적용되어야합니다.use_env 기능 합니다. 긍정적 인 측면에서, 이러한 변수는 신뢰할 수있는 정보가 없을 때 유용 할 수 있습니다. 부정적인 측면에서 이러한 변수를 변경하는 편리한 방법은 없습니다.

resize프로그램 (제공되는 유틸리티 xterm) 화면 크기를 결정하기위한 VT100 스타일 커서 위치 보고서 이스케이프 시퀀스를 사용할 수 있습니다. 이것은 명령 행에서 실행할 수 있습니다. 자동으로 수행하는 편리한 방법은 없습니다. 부작용으로로 resize표시된 행 / 열에 대한 정보를 업데이트합니다 stty. 업데이트 환경 변수를 제공하기위한 그 용도는 여기서이 같은 경우에 유용하게 LINES하고 COLUMNS 있다 설정하고 갱신한다.


답변

내 임베디드 Linux 시스템 (Angstrom을 실행하는 Overo)에서 나를 위해 일한 다른 솔루션이 있습니다. 방금 .bashrc 파일에서 실행했습니다. X 패키지를 설치해야하기 때문에 크기 조정을 사용하고 싶지 않았으며 원하지 않습니다.

터미널이 24 줄보다 크다고 Raspberry Pi에 알리기 | 얕은 생각 블로그


답변

FreeBSD를 대신 사용할 수 있다면 resizewin (1) 명령 이 있습니다.


답변

직렬 회선을 통해 쉘 세션을 실행할 때는 다음을 호출하기에 충분합니다. resize 경우 연결을 설정 한 후 및 각 터미널 구조가 변경된 후 해당 세션 내 명령 .

resize명령은 xterm의 일부이지만 X11에 의존하지 않습니다. 예를 들어, Fedora에서는 별도로 패키지되어 xterm-resize있습니다.

작동 방식 : resize 명령은 일부 커서 이동을 통해 높이 / 폭을 측정 한 다음 이스케이프 시퀀스를 통해 해당 값을 터미널에 보냅니다.

zsh와 같은 쉘을 사용하면 자동으로 LINESCOLUMNS 변수를 (또는 명령이 stdout에 인쇄하는 내보내기 명령문을 평가할 수도 있음).

이것이 필요한 이유 : 로컬 또는 ssh 세션의 경우 터미널은 지오메트리 변경에 대해 세션에 신호를 보낼 수 있습니다 (SIGWINCH 참조). 이 메커니즘은 직렬 연결에서는 작동하지 않습니다.


답변

다음은 bash에만 작동하는 간단하고 빠른 크기 조정 기능입니다. read -d delim시간 초과가 읽히지 않도록 bash를 사용하여 phk의 res2에서 수정되었습니다 .

resize() {
  old=$(stty -g)
  stty -echo
  printf '\033[18t'
  IFS=';' read -d t _ rows cols _
  stty "$old"
  stty cols "$cols" rows "$rows"
}