Como un ejemplo simple, quiero escribir un script CLI que pueda imprimir =
en todo el ancho de la ventana del terminal.
#!/usr/bin/env php
<?php
echo str_repeat('=', ???);
o
#!/usr/bin/env python
print '=' * ???
o
#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n '='; let x=$x+1 done; echo
Respuestas:
tput cols
te dice el número de columnas.tput lines
te dice el número de filas.fuente
echo -e "lines\ncols"|tput -S
para obtener tanto las líneas como los cols, consulte: linux.about.com/library/cmd/blcmdl1_tput.htmtput
es un gran comando con muchos comandos para leer el estado del terminal, controlar el cursor y las propiedades del texto, etc.alias dim="echo $(tput cols)x$(tput lines)"
que podría resultar en80x50
.alias dim='echo Terminal Dimensions: $(tput cols) columns x $(tput lines) rows'
En bash, las variables ambientales
$LINES
y$COLUMNS
deberían poder hacer el truco. El se configurará automáticamente ante cualquier cambio en el tamaño del terminal. (es decir, la señal SIGWINCH )fuente
checkwinsize
opción. Por ejemplo, este script no interactivo imprimirá las dimensiones del terminal en el que se ejecuta:shopt -s checkwinsize; (:); echo $LINES $COLUMNS
(lacheckwinsize
opción solo inicializa las variables después de esperar a que termine una subshell, por eso necesitamos la(:)
declaración)$LINES
y$COLUMNS
se actualizan después de queSIGWINCH
se envía, en realidad después de cualquier ejecución de comando interactivo. Si intenta actualizarPS1
contrap SIGWINCH
no puede usar$LINES
y$COLUMNS
, mantienen los valores antiguos ((LINES
yCOLUMNS
solo se establecen como variables de shell por bash. Bash no los establecerá como variables de entorno , a menos que exporte estas variables de shell.Y hay
stty
, de coreutilsImprimirá el número de filas y columnas, o alto y ancho, respectivamente.
Luego puede usar cualquiera
cut
oawk
extraer la parte que desea.Eso es
stty size | cut -d" " -f1
para la altura / líneas ystty size | cut -d" " -f2
para el ancho / columnasfuente
fuente
tr
comando todos estos años? (facepalm)yes '='
generará una cantidad infinita de líneas '=' y los siguientes comandos se organizarán lo suficiente como para llenar el terminalPara hacer esto en el entorno de la CLI de Windows, la mejor manera que puedo encontrar es usar el comando de modo y analizar la salida.
¡Espero que sea útil!
NOTA : La altura devuelta es el número de líneas en el búfer, no es el número de líneas visibles dentro de la ventana. ¿Hay mejores opciones por ahí?
fuente
En POSIX, en última instancia, desea invocar la llamada
TIOCGWINSZ
(Get WINdow SiZe)ioctl()
. La mayoría de los idiomas deberían tener algún tipo de envoltorio para eso. Por ejemplo, en Perl puedes usar Término :: Tamaño :fuente
:io.columns
Erlang:io:columns().
erlang.org/doc/man/io.html#columns-0TIOCGWINSZ
en el estándar POSIX yioctl()
solo se define para la función STREAMS obsoleta.Como mencioné en la respuesta de lyceus, su código fallará en Windows de configuración regional que no esté en inglés porque la salida de
mode
puede no contener las subcadenas "columnas" o "líneas":Puede encontrar la subcadena correcta sin buscar texto:
Tenga en cuenta que ni siquiera me estoy molestando con las líneas porque no es confiable (y en realidad no me importan).
Editar: Según los comentarios sobre Windows 8 (oh, tú ...), creo que esto puede ser más confiable:
Sin embargo, pruébelo porque no lo probé.
fuente
---
línea. i.imgur.com/4x02dqT.png$mode = `mode`; list($rows, $cols) = array_slice(preg_split('/\n/', substr($mode, strpos($mode, 'CON:'))), 2, 2);
. Y luego simplemente reemplazo todo menos los números.CON device status:
. Quizás emparejar algo asíCON.*:
funcionaría mejor.Inspirado por la respuesta de @ pixelbeat, aquí hay una barra horizontal creada por un
tput
ligero mal uso delprintf
relleno / relleno ytr
fuente
Hay algunos casos en los que sus filas / LÍNEAS y columnas no coinciden con el tamaño real del "terminal" que se está utilizando. Quizás no tenga un "tput" o "stty" disponible.
Aquí hay una función bash que puede usar para verificar visualmente el tamaño. Esto funcionará hasta 140 columnas x 80 filas. Puede ajustar los máximos según sea necesario.
fuente