크기 조정 가능한 직렬 콘솔 창?


25

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

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

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

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

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

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

답변:


26

앞서 언급 한 주석가들과 마찬가지로 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).


3
PS :보다 영구적으로 만들려면 [[ $(tty) == /dev/ttyS0 ]] && trap res2 DEBUG쉘 프로파일 구성 중 하나에 추가하십시오 (예 : /etc/profile, ~/.bash_profile). 이렇게하면 모든 단일 명령 후에 실행됩니다 (screen / tmux / terminal-emulator로 창 / 창의 크기를 조정하는 경우에만 좋습니다).
rsaw

2
몇 분 동안 그것을 사용 후 나는 빨리 모두 실현 res및이 res2첫 로그인에 아무것도하지만 사용하기 너무 느리다. 내 컴퓨터에서 모두 완료하는 데 0.5 초가 걸립니다 ... 모든 명령이 느리게 나타납니다 (DEBUG 트랩과 함께 사용하는 경우). 으악! 가질 수 없습니다. 내가 설치 될 것 같아요 xterm.
rsaw

3
@phk xterm의 resize속도는 빠르지 만 보통 0.002 초입니다.
rsaw

1
@ rsaw 아 알았어, 좋아, 나는 그것이 비슷한 행동을 할 것이라고 생각했기 때문에 비슷하게 느릴 것이라고 생각했다. 나는 어떤 사람들 busybox은 저에게 느려진 것처럼 보였습니다.
phk

1
이 독립형 솔루션에 감사드립니다. x11 또는 xterm이 설치되지 않은 콘솔 전용 배포판을 사용하고 있으므로 resize옵션이 아닙니다.
thom_nic

16

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

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

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

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

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

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

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


1
즉, 시리얼 라인을 통해 프로토콜을 실행할 수 있어야하지 않는 모든 기능을 제공합니다? 클라이언트와 서버가 있다는 뜻입니다. 인 밴드 이스케이프 시퀀스를 사용하여 거의 모든 작업을 수행 할 수 있으며 일반 텍스트 직렬 콘솔로 작업 할 수 있습니다!
Evi1M4chine

1
실제로 코드의 주석은 resize시스템에 설치된 버전이 아니라는 것을 분명히합니다 .
Thomas Dickey

9

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

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

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

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

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


3

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

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


3
링크를 게시하지 마십시오. 여기에 정보를 제공 할 수 있도록 관련 세부 정보를 포함 시키십시오.
jasonwryan

1
너무 나쁘면 파이썬이 필요합니다.
Craig McQueen


1

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

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

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

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

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


0

다음은 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"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.