Estou com um problema em que estou tentando obter o tamanho de um terminal usando scripts. Normalmente eu usaria o comando tput cols
dentro do console, no entanto, quero conseguir esse recurso usando estritamente scripts.
A partir de agora, sou capaz de detectar o console em execução e obter o caminho do arquivo. No entanto, estou lutando para usar essas informações para obter a largura do console. Eu tentei usar o comando tput
, mas sou bastante novo no Linux / scripts, portanto, realmente não sei o que fazer.
A razão para fazer isso é que eu quero poder configurar uma entrada cron que notifique o console de sua largura / colunas de vez em quando.
Este é o meu código até agora:
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)
A saída normal de TERMINAL
& TERMINALPATH
are e , por exemplo &pts/terminalnumber
/dev/pts/terminalnumber
pts/0
/dev/pts/0
fonte
cron
empregos tivessem terminais de controle.Respostas:
O
tput
comando é uma excelente ferramenta, mas infelizmente não pode recuperar as configurações reais de um terminal selecionado arbitrariamente.A razão para isso é que ele lê stdout para as características do terminal, e é também aqui que ele escreve sua resposta. Portanto, no momento em que você tenta capturar a saída,
tput cols
você também removeu a fonte de suas informações.Felizmente,
stty
lê stdin em vez de stdout para determinar as características do terminal; portanto, é assim que você pode recuperar as informações de tamanho necessárias:A propósito, é desnecessariamente complicado escrever isso como
echo $(/usr/bin/tput cols)
.Para qualquer construção que
echo $(some_command)
você está executandosome_command
e capturando sua saída, a qual você passa paraecho
a saída. Em quase todas as situações, pode-se imaginar que você acabou de executarsome_command
e permitir que ele produza diretamente sua saída. É mais eficiente e também mais fácil de ler.fonte
tput
/nurses
? O meu (ncurses 6.0.20160625) executa o TIOCGWINSZ no stderr se não puder fazê-lo no stdout.cols=$(tput cols)
oucols=$(tput cols 2<> /dev/ttyx)
funciona muito bem.ncurses 5.7.20100313
aqui. Você é positivocols=$(tput cols 2<> /dev/tty1)
não funciona para você?tput cols
ele lê do stderr . Agora preciso descobrir como reescrever minha resposta ...stty size <"$terminal" | read rows columns
em vez de tentar analisarstty -a
tput cols
etput lines
consulte o tamanho do terminal (do driver do dispositivo do terminal, não do próprio terminal) do dispositivo do terminal no seu stdout e, se o stdout não for um dispositivo do terminal, como no caso decols=$(tput cols)
um tubo, no stderr.Portanto, para recuperar os valores de um dispositivo terminal arbitrário, é necessário abrir esse dispositivo no stderr de
tput
:(aqui aberto no modo somente leitura, para
tput
não emitir suas mensagens de erro).Como alternativa, você pode usar
stty size
.stty
consulta o terminal no stdin:Nenhum deles é padrão, portanto pode (e na prática funcionará) não funcionar em todos os sistemas. No entanto, deve ser bastante portátil para os sistemas GNU / Linux.
A inclusão de
stty size
ou outro método para consultar o tamanho do terminal foi solicitada ao POSIX, mas a discussão não parece estar indo a lugar algum.fonte
Este script:
Trabalhou aqui com absolutamente nada mais .....
Por que você está configurando uma variável de ambiente com dados? COLUNAS = $ (/ home / test / Documents / get_columns.sh)
Você está tentando obter as colunas e linhas de outro script ou tty? É isso? Ainda estranho para mim, porque você está configurando a variável de ambiente colunas para o script local ....
fonte
cron
trabalho do OP para um terminal específico.cron
trabalho consulta um terminal específico por suas características. (Eu não sou inteiramente certo porque ele precisa fazer isso, mas é isso que o OP quer.)Minha resposta é diferente da de Roaima, pois é dinâmica. A resposta dele / dela fornece o tamanho do terminal na criação. Se você está, por exemplo, usando um gerenciador de janelas lado a lado, como i3 ou bspwm, prefere ter a largura atual do terminal. Portanto, eu uso o ssty do pacote coreutils:
A solução de Luciano funciona perfeitamente no xterm e no xfce4-terminal. Não sei se todos os terminais definem a variável $ COLUMNS.
fonte