Me encuentro con un problema en el que intento obtener el tamaño de un terminal mediante el uso de scripts. Normalmente usaría el comando tput cols
dentro de la consola, sin embargo, quiero poder lograr esta característica usando estrictamente scripts.
A partir de ahora puedo detectar la consola en ejecución y obtener su ruta de archivo. Sin embargo, estoy luchando por usar esta información para obtener el ancho de la consola. Intenté usar el comando tput
, pero soy bastante nuevo en Linux / scripts, por lo que no sé qué hacer.
La razón para hacer esto es que quiero poder configurar una entrada cron que notifique a la consola su ancho / columnas de vez en cuando.
Este es mi código hasta ahora:
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)
La salida normal de TERMINAL
& TERMINALPATH
are y , por ejemplo &pts/terminalnumber
/dev/pts/terminalnumber
pts/0
/dev/pts/0
fuente
cron
trabajos tuvieran terminales de control.Respuestas:
El
tput
comando es una herramienta excelente, pero desafortunadamente no puede recuperar la configuración real de un terminal seleccionado arbitrariamente.La razón de esto es que lee stdout para las características del terminal, y aquí también es donde escribe su respuesta. Entonces, en el momento en que intenta capturar la salida
tput cols
, también ha eliminado la fuente de su información.Afortunadamente,
stty
lee stdin en lugar de stdout para determinar las características del terminal, por lo que así es como puede recuperar la información de tamaño que necesita:Por cierto, es innecesariamente engorroso escribir esto como
echo $(/usr/bin/tput cols)
.Para cualquier construcción
echo $(some_command)
que esté ejecutandosome_command
y capturando su salida, que luego pasaecho
a la salida. En casi todas las situaciones, puede imaginar que también podría haber ejecutadosome_command
y dejar que entregue su salida directamente. Es más eficiente y también más fácil de leer.fuente
tput
/nurses
? Mine (ncurses 6.0.20160625) hace el TIOCGWINSZ en stderr si no puede hacerlo en stdout.cols=$(tput cols)
ocols=$(tput cols 2<> /dev/ttyx)
funciona bien.ncurses 5.7.20100313
aquí. ¿Eres positivocols=$(tput cols 2<> /dev/tty1)
no funciona para ti?tput cols
lee desde stderr . Ahora necesito encontrar la manera de volver a escribir mi respuesta ...stty size <"$terminal" | read rows columns
lugar de tratar de analizarstty -a
tput cols
ytput lines
consulte el tamaño del terminal (desde el controlador del dispositivo terminal, no el terminal en sí) desde el dispositivo terminal en su stdout, y si stdout no es un dispositivo terminal como en el caso decols=$(tput cols)
donde es entonces una tubería, desde stderr.Por lo tanto, para recuperar los valores de un dispositivo terminal arbitrario, debe abrir ese dispositivo en el stderr de
tput
:(aquí se abre en modo de solo lectura, por lo
tput
que no muestra sus mensajes de error allí).Alternativamente, puede usar
stty size
.stty
consulta la terminal en stdin:Ninguno de ellos es estándar, por lo que puede (y en la práctica) no funcionará en todos los sistemas. Sin embargo, debería ser bastante portátil para los sistemas GNU / Linux.
Se
stty size
solicitó la adición de u otro método para consultar el tamaño del terminal a POSIX, pero la discusión no parece ir a ninguna parte.fuente
Este guión:
Trabajé aquí con absolutamente nada más .....
¿Por qué está configurando una variable de entorno con datos? COLUMNS = $ (/ home / test / Documents / get_columns.sh)
¿Estás tratando de obtener las columnas y líneas de otro script o tty? ¿Es asi? Todavía es extraño para mí porque está configurando la variable de entorno de columnas para el script local ...
fuente
cron
trabajo del OP para un terminal en particular.cron
trabajo consulta a un terminal en particular por sus características. (No estoy completamente seguro de por qué necesita hacer esto, pero eso es lo que quiere el OP.)Mi respuesta es diferente a la de Roaima, ya que es dinámica. Su respuesta le da el tamaño del terminal en la creación. Si, por ejemplo, está utilizando un administrador de ventanas de mosaico, como i3 o bspwm, preferiría tener el ancho actual del terminal. Por lo tanto, uso ssty del paquete coreutils:
La solución de Luciano funciona perfectamente en xterm y xfce4-terminal. No sé si todas las terminales establecen la variable $ COLUMNS.
fuente