Bashスクリプトを使用してコンソール幅を取得する

Bashスクリプトを使用してコンソール幅を取得する

スクリプトを使用して端末サイズを取得しようとしたときに問題が発生しました。通常、私はコンソール内でこのコマンドを使用しますtput colsが、厳密にスクリプトを使用してこのコマンドを実行できるようにしたいと思います。

現時点では、実行中のコンソールを検出して対応するファイルパスを取得できます。しかし、この情報を使用してコンソールの幅を取得するのは困難です。コマンドを試してみましたが、tputLinux / Scriptingに初めて触れたので、何をすべきかわかりません。

その理由は、予約されたこと幅/列項目をコンソールに頻繁に通知します。

これは私のコードです。

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 sizestty

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変数セットがあるかどうかはわかりません。

関連情報