Bash 스크립트를 사용하여 콘솔 너비 얻기

Bash 스크립트를 사용하여 콘솔 너비 얻기

스크립트를 사용하여 터미널 크기를 얻으려고 하는 중에 문제가 발생했습니다. 일반적으로 나는 콘솔 내에서 이 명령을 사용 tput cols하지만, 엄격하게 스크립트를 사용하여 이 명령을 수행할 수 있기를 원합니다.

현재로서는 실행 중인 콘솔을 감지하고 해당 파일 경로를 얻을 수 있습니다. 하지만 이 정보를 사용하여 콘솔의 너비를 구하는 데 어려움을 겪고 있습니다. 명령을 사용해 보았지만 tputLinux/스크립팅을 처음 접했기 때문에 무엇을 해야할지 모르겠습니다.

그 이유는 내가예약 된 일들너비/열 항목을 콘솔에 자주 알립니다.

이것은 지금까지 내 코드입니다.

tty.sh

#!/bin/bash

#Get PID of terminal
#terminal.txt holds most recent PID of console in use
value=$(</home/test/Documents/terminal.txt)

#Get tty using the PID from terminal.txt
TERMINAL="$(ps h -p $value -o tty)"
echo $TERMINAL

#Use tty to get full filepath for terminal in use
TERMINALPATH=/dev/$TERMINAL
echo $TERMINALPATH

COLUMNS=$(/home/test/Documents/get_columns.sh)
echo $COLUMNS

getcolumn.sh

#!/usr/bin/env bash
echo $(/usr/bin/tput cols)

TERMINAL&의 일반적인 출력 TERMINALPATH은 합계입니다. 예를 들어 &pts/terminalnumber/dev/pts/terminalnumberpts/0/dev/pts/0

답변1

tput명령은 훌륭한 도구이지만 불행하게도 선택한 터미널의 실제 설정을 검색할 수는 없습니다.

그 이유는 다음과 같습니다.표준 출력터미널 속성의 경우 여기에 답이 기록됩니다. 따라서 출력을 캡처하려는 순간 tput cols해당 정보의 소스도 제거됩니다.

다행히 stty독서는표준 입력대신에표준 출력터미널 특성을 결정하는 데 사용되므로 다음을 통해 필요한 크기 정보를 검색할 수 있습니다.

terminal=/dev/pts/1
columns=$(stty -a <"$terminal" | grep -Po '(?<=columns )\d+')
rows=$(stty -a <"$terminal" | grep -Po '(?<=rows )\d+')

그건 그렇고, 그렇게 쓰는 것은 불필요한 번거로움입니다 echo $(/usr/bin/tput cols).

echo $(some_command)실행 중인 구성이 무엇이든 해당 출력을 캡처한 some_command다음 이를 echo출력에 전달합니다. 거의 모든 경우에 그냥 실행 some_command하고 출력을 직접 제공하도록 하는 것이 더 나을 수도 있다고 상상할 수 있습니다 . 더 효율적이고 읽기 쉽습니다.

답변2

tput cols그리고 tput lines터미널 장치의 stdout(터미널 자체가 아닌 터미널 장치 드라이버에서)에서 터미널 크기를 쿼리 cols=$(tput cols)하거나, stdout이 터미널 장치가 아닌 경우(파이프인 경우와 마찬가지로) stderr에서 쿼리합니다.

따라서 터미널 장치에서 값을 검색하려면 stderr에서 장치를 열어야 합니다 tput.

{ cols=$(tput cols) rows=$(tput lines); } 2< "$TERMINALPATH"

(읽기 전용 모드로 열리므로 tput오류 메시지가 출력되지 않습니다.)

또는 다음을 사용하여 stdin에서 터미널을 쿼리 할 수도 있습니다 stty size.stty

read rows cols < <(stty size < "$TERMINALPATH")

이들 중 어느 것도 표준이 아니므로 모든 시스템에서 작동하지 않을 수도 있고 실제로 작동하지 않을 수도 있습니다. 그러나 GNU/Linux 시스템에 이식성이 좋아야 합니다.

stty sizePOSIX 요청 또는 기타 방법을 추가하여 터미널 크기를 쿼리하세요.하지만 논의가 진전될 것 같지는 않습니다.

답변3

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

#!/bin/bash

echo "The number of columns are $COLUMNS"
echo "The number of lines are $LINES"

여기서 일하면 더 이상 아무것도 없습니다…

환경 변수를 설정하기 위해 데이터를 사용하는 이유는 무엇입니까?

COLUMNS=$(/home/test/Documents/get_columns.sh)

다른 스크립트나 tty에서 열과 행을 가져와 보셨나요? 그렇습니까? 로컬 스크립트에 대한 열 환경 변수를 설정하고 있기 때문에 여전히 이상해 보입니다.

답변4

내 대답은 동적이기 때문에 Roema의 대답과 다릅니다. 그/그녀의 대답은 터미널이 생성되었을 때의 크기를 알려줍니다. 예를 들어, 타일링 창 관리자(예: i3 또는 bspwm)를 사용하는 경우 터미널의 현재 너비를 사용하는 것이 좋습니다. 따라서 coreutils 패키지의 ssty를 사용합니다.

#!/bin/bash
stty size | awk '{print $2}'

Luciano의 솔루션은 xterm 및 xfce4-terminal에서 완벽하게 작동합니다. 모든 터미널에 $COLUMNS 변수 세트가 있는지는 모르겠습니다.

관련 정보