스크립트를 사용하여 터미널 크기를 얻는 데 문제가 있습니다. 일반적으로 tput cols
콘솔 내 에서 명령을 사용 하지만 스크립트를 엄격하게 사용하여이 기능을 수행 할 수 있기를 원합니다.
현재 실행중인 콘솔을 감지하고 파일 경로를 얻을 수 있습니다. 그러나 나는이 정보를 사용하여 콘솔의 너비를 얻는 데 어려움을 겪고 있습니다. 나는 명령을 사용하려고 시도했지만 tput
Linux / 스크립트를 처음 접했기 때문에 실제로 무엇을 해야할지 모릅니다.
이렇게하는 이유 는 콘솔에 너비 / 열을 자주 알리는 cron 항목 을 설정할 수 있기를 원합니다 .
이것은 지금까지 내 코드입니다.
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
get_columns.sh
#!/usr/bin/env bash
echo $(/usr/bin/tput cols)
TERMINAL
& 의 일반 출력 TERMINALPATH
은 and 입니다 (예 : &pts/terminalnumber
/dev/pts/terminalnumber
pts/0
/dev/pts/0
답변
이 tput
명령은 훌륭한 도구이지만 불행히도 임의로 선택한 터미널의 실제 설정을 검색 할 수 없습니다.
그 이유 는 터미널 특성에 대한 표준 출력 을 읽으며 응답을 쓰는 곳이기도합니다. 따라서 tput cols
당신이 당신 의 출력을 캡처하려고하는 순간 정보의 소스를 제거했습니다.
다행히 터미널 특성을 결정하기 위해 stdout이 아닌 stdin을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
하여 출력을 직접 전달할 수 있다고 상상할 수 있습니다 . 더 효율적이고 읽기도 쉽습니다.
답변
tput cols
과 tput lines
쿼리를 상기 단말 장치로부터의 표준 출력에 (그 자체 단말 단말 장치 드라이버로부터의) 단말기의 크기, 만약 표준 출력은의 경우와 같은 단말 장치가 아닌 cols=$(tput cols)
가 열려진에서 다음 파이프 어디.
따라서 임의의 터미널 장치에서 값을 검색하려면 stderr에서 해당 장치를 열어야합니다 tput
.
{ cols=$(tput cols) rows=$(tput lines); } 2< "$TERMINALPATH"
(여기서는 읽기 전용 모드로 열리므로 tput
오류 메시지가 출력되지 않습니다).
또는을 사용할 수도 있습니다 stty size
. stty
stdin에서 터미널을 쿼리합니다.
read rows cols < <(stty size < "$TERMINALPATH")
이들 중 어느 것도 표준이 아니므로 모든 시스템에서 작동하지 않을 수도 있습니다 (실제로는 작동하지 않을 수도 있음). 그래도 GNU / Linux 시스템에 이식성이 뛰어나야합니다.
stty size
POSIX에 터미널 크기를 쿼리 하는 추가 또는 다른 방법이 요청 되었지만 토론이 진행되지 않는 것 같습니다.
답변
이 스크립트는 :
#!/bin/bash
echo "The number of columns are $COLUMNS"
echo "The number of lines are $LINES"
더 이상 아무것도하지 않고 여기에서 일했습니다 …..
데이터로 환경 변수를 설정하는 이유는 무엇입니까? COLUMNS = $ (/ home / test / Documents / get_columns.sh)
다른 스크립트 또는 tty에서 열과 줄을 가져 오려고합니까? 그게 다야? 로컬 스크립트에 대해 열 환경 변수를 설정하기 때문에 여전히 이상합니다 ….
답변
내 대답은 동적이기 때문에 Roaima와 다릅니다. 그 / 그녀의 대답은 당신이 창조 할 때 터미널의 크기를 알려줍니다. 예를 들어 i3 또는 bspwm과 같은 바둑판 식 창 관리자를 사용하는 경우 터미널의 현재 너비를 원할 것입니다. 따라서 coreutils 패키지에서 ssty를 사용합니다.
#!/bin/bash
stty size | awk '{print $2}'
Luciano의 솔루션은 xterm 및 xfce4 터미널에서 완벽하게 작동합니다. 모든 터미널이 $ COLUMNS 변수를 설정했는지 알 수 없습니다.