
스크립트를 사용하여 터미널 크기를 얻으려고 하는 중에 문제가 발생했습니다. 일반적으로 나는 콘솔 내에서 이 명령을 사용 tput cols
하지만, 엄격하게 스크립트를 사용하여 이 명령을 수행할 수 있기를 원합니다.
현재로서는 실행 중인 콘솔을 감지하고 해당 파일 경로를 얻을 수 있습니다. 하지만 이 정보를 사용하여 콘솔의 너비를 구하는 데 어려움을 겪고 있습니다. 명령을 사용해 보았지만 tput
Linux/스크립팅을 처음 접했기 때문에 무엇을 해야할지 모르겠습니다.
그 이유는 내가예약 된 일들너비/열 항목을 콘솔에 자주 알립니다.
이것은 지금까지 내 코드입니다.
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/terminalnumber
pts/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 size
POSIX 요청 또는 기타 방법을 추가하여 터미널 크기를 쿼리하세요.하지만 논의가 진전될 것 같지는 않습니다.
답변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 변수 세트가 있는지는 모르겠습니다.