Bir bash betiği kullanarak konsol genişliğini alma


15

Komut dosyalarını kullanarak bir terminalin boyutunu almaya çalıştığım bir sorunla karşılaşıyorum. Normalde tput colskonsol içindeki komutu kullanırdım , ancak bu özelliği kesinlikle komut dosyaları kullanarak başarmak istiyorum.

Şu andan itibaren çalışan konsolu tespit edip dosya yolunu alabiliyorum. Ancak bu bilgileri konsolun genişliğini elde etmek için kullanmakta zorlanıyorum. Komutu kullanmayı denedim tput, ancak Linux / komut dosyalarında oldukça yeniyim, bu yüzden ne yapacağımı gerçekten bilmiyorum.

Bunu yapmanın nedeni , konsolu genişliğini / sütunlarını sık sık bildiren bir cron girişi ayarlayabilmek istiyorum .

Bu şimdiye kadar benim kod:

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)

Normal çıkış TERMINAL& TERMINALPATHvardır ve örneğin, vepts/terminalnumber/dev/pts/terminalnumberpts/0/dev/pts/0


1

@phk Bunun yardımcı olduğunu düşünmüyorum. Sorun, tty sürücüsüne sütunlar / satırlar için gerçek değerleri nasıl anlatacağımızdır. İşte onları tty sürücüsünden belirlemek.
roaima

cronİşlerin kontrol terminalleri olduğunu düşünmemiştim .
TMN

Yanıtlar:


18

tputKomut mükemmel bir araçtır, fakat maalesef, rasgele seçilmiş bir terminale ilişkin gerçek ayarları alamıyor.

Bunun nedeni , terminal karakteristikleri için stdout okuması ve aynı zamanda cevabını yazdığı yerdir. Böylece, çıktılarınızı yakalamaya çalıştığınız an tput colsda bilgilerinin kaynağını kaldırdınız.

Neyse ki, terminal özelliklerini belirlemesi için stdout yerine stdin'istty okur , böylece ihtiyacınız olan boyut bilgilerini şu şekilde alabilirsiniz:

terminal=/dev/pts/1
columns=$(stty -a <"$terminal" | grep -Po '(?<=columns )\d+')
rows=$(stty -a <"$terminal" | grep -Po '(?<=rows )\d+')

Bu arada, bunu yazmak gereksiz yere hantal echo $(/usr/bin/tput cols).

Herhangi bir yapı echo $(some_command)için, some_commanddaha sonra echoçıktıya geçtiğiniz çıktısını yakalar ve yakalarsınız . Hemen hemen her durumda, sadece koşmuş olabileceğinizi some_commandve çıktısını doğrudan teslim etmesine izin verebileceğinizi hayal edebilirsiniz . Daha verimli ve okunması daha kolay.


Hangi uygulama / sürüm tput/ nurses? Mine (ncurses 6.0.20160625), stdout'ta yapamazsa TIOCGWINSZ'yi stderr'de yapar. cols=$(tput cols)ya da cols=$(tput cols 2<> /dev/ttyx) gayet iyi çalışıyor.
Stéphane Chazelas

@ StéphaneChazelas Debian "sid" den kurulu olarak 5.9 + 20140913-1 + b1 aldım. Şimdi daha yeni bir sürüm arıyorum.
roaima

1
İle de çalışır ncurses 5.7.20100313burada. Olumlu musunuz sizin cols=$(tput cols 2<> /dev/tty1)için çalışmıyor mu?
Stéphane Chazelas

@ StéphaneChazelas büyüleyici. Haklısın: Stdout'u bir terminalden uzaklaştırırsam tput cols, stderr'den okur . Şimdi cevabımı yeniden yazmak için nasıl çalışmalıyım ...
roaima

1
stty size <"$terminal" | read rows columnsAyrıştırmaya çalışmak yerine kullanmak isterdimstty -a
Random832

13

tput colsve tput linesstdout'undaki terminal aygıtından terminalin boyutunu (terminal aygıt sürücüsünden değil, terminal aygıt sürücüsünden) ve stdout, cols=$(tput cols)o zaman bir borunun olduğu durumda bir terminal aygıtı değilse , stderr'den sorgulayın.

Bu nedenle, değerleri rasgele bir terminal cihazından almak için, o cihazı aşağıdaki noktadan açmanız gerekir tput:

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

(burada salt okunur modda açılır, bu nedenle tputhata mesajlarını orada vermez).

Alternatif olarak, kullanabilirsiniz stty size. sttystdin'deki terminali sorgular:

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

Bunların hiçbiri standart değildir, bu nedenle tüm sistemlerde çalışmayabilir (ve pratikte çalışmayacaktır). Yine de GNU / Linux sistemleri için oldukça taşınabilir olmalıdır.

Eklenmesi stty sizesorgu uç boyutuna veya diğer yöntem POSIX'e istendi ancak tartışma yerde gidiyor gibi görünmüyor.


9

Bu komut dosyası:

#!/bin/bash

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

Burada kesinlikle başka bir şey ile çalıştı .....

Neden verilerle bir ortam değişkeni ayarlıyorsunuz? KOLONLAR = $ (/ home / test / Belgeler / get_columns.sh)

Sütunları ve satırları başka bir komut dosyasından veya tty'den almaya çalışıyorsunuz? Öyle mi? Yerel komut dosyası için sütun ortam değişkenini ayarladığınız için hala garipim ....


Bu, OP'nin cronbelirli bir terminal için yaptığı iş içindeki değerlerin alınmasına yardımcı olmaz .
roaima

1
Ahn? Ne? Şimdi daha kafam karıştı, cronjobs komut dosyalarının genişliği olabilir ????? Aslında bir terminalde çalışmazlar.
Luciano Andress Martini

Biliyorum. cronİş özelligi için özel bir terminali sorgular. (Bunu neden yapması gerektiğinden tam olarak emin değilim, ancak OP'nin istediği bu.)
roaima

@LucianoAndressMartini $ COLUMNS ve $ LINES bash değişkenleridir, örneğin çizgi ve
posh'ta

Tks. Gerçekten biliyorum, ama benim senaryom / bin / bash ile hashbang olduğunu ben bunu kullanmanız gerektiğini bilmek gerekiyor sanırım. Eğer bash olmadan bazı unix kullanıyorsanız, belki cevabım sizin için değil.
Luciano Andress Martini

1

Cevabım dinamik olduğu için Roaima'nınkinden farklı. Onun cevabı, yaratılıştaki terminalin boyutunu verir. Örneğin, i3 veya bspwm gibi bir döşeme penceresi yöneticisi kullanıyorsanız, terminalin geçerli genişliğine sahip olmak istersiniz. Böylece coreutils paketinden ssty kullanıyorum:

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

Luciano'nun çözümü xterm ve xfce4 terminalinde kusursuz çalışıyor. Tüm terminallerin $ COLUMNS değişkenini ayarlayıp ayarlamadığını bilmiyorum.


Bu benim cevabımdan daha dinamik değil. Her ikisi de komutları çalıştırdığınız noktada terminal boyutunu verir.
roaima
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.