スクリプトを使用して端末のサイズを取得しようとする問題が発生しています。通常、コンソール内でコマンドtput cols
を使用しますが、厳密にスクリプトを使用してこの機能を実現できるようにしたいと考えています。
現在のところ、実行中のコンソールを検出し、そのファイルパスを取得することができます。ただし、この情報を使用してコンソールの幅を取得するのに苦労しています。コマンドtput
を使用してみましたが、Linux /スクリプトはかなり初めてなので、何をすべきか本当にわかりません。
これを行う理由は、コンソールに幅/列を時々通知するcronエントリをセットアップできるようにしたいからです。
これはこれまでのところ私のコードです:
#!/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
#!/usr/bin/env bash
echo $(/usr/bin/tput cols)
TERMINAL
&TERMINALPATH
の通常の出力は、pts/terminalnumber
および/dev/pts/terminalnumber
です。たとえば、pts/0
&/dev/pts/0
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
_を実行して出力を直接配信することもできます。より効率的で読みやすくなります。
_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に要求されました しかし、議論はどこにも進んでいないようです。
このスクリプト:
#!/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変数を設定しているかどうかはわかりません。