내 시스템의 직렬 콘솔을 사용할 때 항상 $COLUMNS=80
및 으로 끝납니다 $LINES=24
.
이러한 변수를 수동으로 변경할 수 있지만 클라이언트 터미널 창의 크기를 조정하는 동안 언제든지 이 작업을 수행하는 것은 약간 성가신 일입니다.
일반적으로 나는 콘솔에 연결을 사용합니다 screen /dev/mytty baudrate
.
$TERM
환경 변수를 "screen" 또는 "xterm"으로 변경해 도 도움이 되지 않습니다.
getty
통화에 vt100 대신 이들 중 일부를 사용해야 합니까 ?
말할 필요도 없이, SSH를 사용하여 동일한 시스템에 연결할 때 이 모든 것이 잘 작동합니다.
답변1
이전 해설자가 언급했듯이 각 명령 다음에 호출하는 것 외에는 선택의 여지가 없습니다. 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"
}
res
제안된 솔루션을 기반으로https://wiki.archlinux.org/index.php/working_with_the_serial_console#Resizing_a_terminal. 작동 방식은 다음과 같습니다.res2
xterm의 영향을 받습니다resize.sh
(참조https://github.com/ThomasDickey/xterm-snapshots/blob/master/vttests/resize.sh). 이는xterm
우리가 원하는 정보를 얻기 위해 특정 코드를 사용합니다 (많은 터미널 에뮬레이터에서 구현됨). 다음을 참조하세요.http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Functions-using-CSI-_-ordered-by-the-final-character_s_("텍스트 영역의 크기를 문자 단위로 보고합니다.").
그건 그렇고, 내 .profile
파일에서 다음을 찾을 수 있습니다
[ $(tty) = /dev/ttyS0 ] && res
. 예를 들어 장치를 다시 시작한 후 직렬 회선(관리에 사용하는 회선)을 통해 로그인할 때마다 터미널 크기를 결정하기 위한 것입니다.
다음 아이디어도 참조하세요.톱니 모양의각 명령 다음에 크기 조정을 실행하려면 주석에 이 행을 추가하십시오 [ $(tty) = /dev/ttyS0 ] && trap res2 DEBUG
(내가 아는 한 이것이 항상 가능한 것은 아니거나 항상 가능한 것은 아니라는 점에 유의하십시오 busybox
).
답변2
기록을 위해 해당 질문에 대한 답변은 다음과 같습니다(유즈넷이 이겼습니다).
가상 터미널 애플리케이션(및 기타 애플리케이션) 내에서 실행되는 콘솔 애플리케이션은 xterm
크기 조정 작업이 발생한 후 이를 수신합니다 rxvt
. SIGWINCH
따라서 응용 프로그램은 해당 신호 처리기에서 창 등을 다시 그릴 수 있습니다.
불행하게도 직렬 콘솔을 사용할 때는 그러한 메커니즘이 없습니다.
그러나 애플리케이션은 적극적으로 요청할 수 있습니다.현재의콘솔 창 크기. 따라서 두 번째로 좋은 방법은 쉘이 명령 프롬프트를 인쇄할 때마다 이 작업을 수행하는 것입니다.
이는 먼저 달성할 수 있습니다.특수하게 크기가 조정된 실행 파일 컴파일그런 다음 다음을 사용하십시오 bashrc
.
if [ $(tty) == '/dev/ttyS0' ]; then
trap resize DEBUG
fi
물론 런타임 시 콘솔 애플리케이션의 콘솔 크기 설정은 변경되지 않습니다.
답변3
"크기 조정이 가능한" 터미널 자체는 NAWS(Negotiate About Window Size
~에서RFC 1073 텔넷 창 크기 옵션).
직렬 포트를 사용하여 컴퓨터에 직접 연결하는 경우 협상이 필요하지 않으며 컴퓨터는 터미널의 화면 크기를 직접 알 수 없습니다.
터미널이 크기를 협상할 수 있으면 컴퓨터는 SIGWINCH
터미널에서 실행 중인 응용 프로그램에 화면 크기 개념을 업데이트하라는 메시지를 보냅니다.
컴퓨터가 화면 크기를 모르는 경우 일반적으로 stty -a
디스플레이 크기(행과 열)를 0으로 설정합니다. 이는 대화식 사용에 약간 비우호적이며 일부 시스템은 환경 변수를 사용하여 LINES
도움 COLUMNS
을 줍니다. 할당된 값가능한일반적으로 터미널 설명에서 파생되며 단순히 하드코드됩니다. 이러한 변수에 대한 계약에서는 명시적으로 억제되지 않는 한 적용되어야 합니다(예: 저주 애플리케이션에서).use_env
기능. 긍정적인 측면에서는 신뢰할 수 있는 정보가 없을 때 이러한 변수가 유용할 수 있습니다. 단점은 이러한 변수를 변경하는 편리한 방법이 없다는 것입니다.
이것resize
프로그램(유틸리티 제공:xterm
) VT100 스타일 커서 위치 보고 이스케이프 시퀀스를 사용하여 화면 크기를 결정할 수 있습니다. 이는 명령줄에서 실행할 수 있습니다. (역시) 이를 자동화하는 편리한 방법은 없습니다. 부작용으로 resize
표시된 행/열에 대한 정보가 업데이트됩니다 stty
. 주로 이와 같은 상황에 대해 업데이트된 환경 변수를 제공하는 데 사용됩니다 LINES
.COLUMNS
예설정을 업데이트해야 합니다.
답변4
이것은 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"
}