카테고리 보관물: 리눅스

리눅스

bash 스크립트를 사용하여 콘솔 너비 얻기 때문에 실제로 무엇을 해야할지 모릅니다. 이렇게하는

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

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

이렇게하는 이유 는 콘솔에 너비 / 열을 자주 알리는 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/terminalnumberpts/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 colstput lines 쿼리를 상기 단말 장치로부터의 표준 출력에 (그 자체 단말 단말 장치 드라이버로부터의) 단말기의 크기, 만약 표준 출력은의 경우와 같은 단말 장치가 아닌 cols=$(tput cols)가 열려진에서 다음 파이프 어디.

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

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

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

또는을 사용할 수도 있습니다 stty size. sttystdin에서 터미널을 쿼리합니다.

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

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

stty sizePOSIX에 터미널 크기를 쿼리 하는 추가 또는 다른 방법이 요청 되었지만 토론이 진행되지 않는 것 같습니다.


답변

이 스크립트는 :

#!/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 변수를 설정했는지 알 수 없습니다.


답변