web-dev-qa-db-ja.com

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

スクリプトを使用して端末のサイズを取得しようとする問題が発生しています。通常、コンソール内でコマンド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)

TERMINALTERMINALPATHの通常の出力は、pts/terminalnumberおよび/dev/pts/terminalnumberです。たとえば、pts/0/dev/pts/0

16
sirgeezer21

tputコマンドは優れたツールですが、残念ながら、任意に選択した端末の実際の設定を取得することはできません。

これは、端末の特性についてstdoutを読み取るためであり、ここにも回答が書き込まれます。したがって、_tput cols_の出力をキャプチャしようとした瞬間に、その情報のソースも削除されました。

幸い、sttyは、端末の特性を決定するためにstdoutではなくstdinを読み取ります。そのため、次の方法で必要なサイズ情報を取得できます。

_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_を実行して出力を直接配信することもできます。より効率的で読みやすくなります。

18
roaima

_tput cols_および_tput lines_は、標準出力の端末デバイスから(端末自体ではなく、端末デバイスドライバーから)端末のサイズをクエリします。stdoutがcols=$(tput cols) stderrからのパイプです。

したがって、任意の端末デバイスから値を取得するには、tputのstderrでそのデバイスを開く必要があります。

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

(ここでは読み取り専用モードで開いているので、tputはエラーメッセージをそこに出力しません)。

または、_stty size_を使用できる場合があります。 sttyは、標準入力で端末を照会します。

_read rows cols < <(stty size < "$TERMINALPATH")
_

これらのどれも標準ではないので、すべてのシステムで機能するわけではありません(実際には機能しません)。ただし、GNU/Linuxシステムにかなり移植可能でなければなりません。

_stty size_または端末サイズを照会する他のメソッドの追加がPOSIXに要求されました しかし、議論はどこにも進んでいないようです。

14

このスクリプト:

#!/bin/bash

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

これ以上何もせずにここで働いた.....

なぜデータで環境変数を設定するのですか? COLUMNS = $(/ home/test/Documents/get_columns.sh)

他のスクリプトまたはttyから列と行を取得しようとしていますか?それですか?ローカルスクリプトの列の環境変数を設定しているので、まだ奇妙です。

私の答えはダイナミックであるため、ロアイマのものとは異なります。彼/彼女の答えは、作成時の端末のサイズを示します。たとえば、i3やbspwmなどのタイリングウィンドウマネージャーを使用している場合は、端末の現在の幅を使用することをお勧めします。したがって、coreutilsパッケージのsstyを使用します。

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

Lucianoのソリューションは、xtermとxfce4-terminalで問題なく動作します。すべての端末が$ COLUMNS変数を設定しているかどうかはわかりません。

1
Sasha