À titre d'exemple simple, je veux écrire un script CLI qui peut imprimer =
sur toute la largeur de la fenêtre du terminal.
#!/usr/bin/env php
<?php
echo str_repeat('=', ???);
ou
#!/usr/bin/env python
print '=' * ???
ou
#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n '='; let x=$x+1 done; echo
Réponses:
tput cols
vous indique le nombre de colonnes.tput lines
vous indique le nombre de lignes.la source
echo -e "lines\ncols"|tput -S
pour obtenir à la fois les lignes et les colonnes,tput
est une excellente commande avec de nombreuses commandes pour lire l'état du terminal, contrôler les propriétés du curseur et du texte, etc.alias dim="echo $(tput cols)x$(tput lines)"
:, ce qui pourrait entraîner80x50
.alias dim='echo Terminal Dimensions: $(tput cols) columns x $(tput lines) rows'
En bash, les variables
$LINES
et l'$COLUMNS
environnement devraient être capables de faire l'affaire. Le sera automatiquement réglé lors de tout changement de taille du terminal. (c'est-à-dire le signal SIGWINCH )la source
checkwinsize
option. Par exemple, ce script non interactif affichera les dimensions du terminal sur lequel il est exécuté:shopt -s checkwinsize; (:); echo $LINES $COLUMNS
(l'checkwinsize
option initialise uniquement les variables après avoir attendu la fin d'un sous-shell, c'est pourquoi nous avons besoin de l'(:)
instruction)$LINES
et$COLUMNS
sont mis à jour après l'SIGWINCH
envoi, en fait après toute exécution de commande interactive. Si vous essayez de mettre à jourPS1
avectrap SIGWINCH
vous ne pouvez pas utiliser$LINES
et$COLUMNS
, ils conservent les anciennes valeurs ((LINES
etCOLUMNS
ne sont définis comme variables shell que par bash. Bash ne les définira pas comme variables d'environnement , sauf si vous exportez ces variables shell.Et il y a
stty
, de coreutilsIl imprimera le nombre de lignes et de colonnes, ou la hauteur et la largeur, respectivement.
Ensuite, vous pouvez utiliser soit
cut
ouawk
pour extraire la pièce que vous souhaitez.C'est
stty size | cut -d" " -f1
pour la hauteur / lignes etstty size | cut -d" " -f2
pour la largeur / colonnesla source
la source
tr
commande toutes ces années? (facepalm)yes '='
produira une quantité infinie de lignes '=' et les commandes suivantes organiseront suffisamment pour remplir le terminalPour ce faire, dans l'environnement Windows CLI, la meilleure façon de trouver est d'utiliser la commande mode et d'analyser la sortie.
J'espère que c'est utile!
Remarque : la hauteur renvoyée est le nombre de lignes dans le tampon, ce n'est pas le nombre de lignes qui sont visibles dans la fenêtre. De meilleures options là-bas?
la source
Sur POSIX, vous voulez finalement invoquer l'appel
TIOCGWINSZ
(Get WINdow SiZe)ioctl()
. La plupart des langues devraient avoir une sorte de wrapper pour cela. Par exemple, en Perl, vous pouvez utiliser Term :: Size :la source
:io.columns
Erlang:io:columns().
erlang.org/doc/man/io.html#columns-0TIOCGWINSZ
en a pas dans la norme POSIX etioctl()
n'est défini que pour la fonction STREAMS obsolète.Comme je l'ai mentionné dans la réponse de lyceus, son code échouera sous Windows local non anglais car la sortie de
mode
ne peut pas contenir les sous-chaînes "colonnes" ou "lignes":Vous pouvez trouver la bonne sous-chaîne sans chercher de texte:
Notez que je ne me soucie même pas des lignes car elles ne sont pas fiables (et je m'en fous en fait).
Edit: Selon les commentaires sur Windows 8 (oh vous ...), je pense que cela peut être plus fiable:
Mais testez-le, car je ne l'ai pas testé.
la source
---
ligne. i.imgur.com/4x02dqT.png$mode = `mode`; list($rows, $cols) = array_slice(preg_split('/\n/', substr($mode, strpos($mode, 'CON:'))), 2, 2);
. Et puis je remplace tout sauf les chiffres.CON device status:
? Peut-être que faire correspondre quelque chose comme çaCON.*:
fonctionnerait mieux.Inspiré par la réponse de @ pixelbeat, voici une barre horizontale créée par une
tput
légère mauvaise utilisation duprintf
rembourrage / remplissage ettr
la source
Dans certains cas, vos lignes / lignes et colonnes ne correspondent pas à la taille réelle du "terminal" utilisé. Peut-être ne disposez-vous pas d'un "tput" ou d'un "stty".
Voici une fonction bash que vous pouvez utiliser pour vérifier visuellement la taille. Cela fonctionnera jusqu'à 140 colonnes x 80 lignes. Vous pouvez ajuster les maximums selon vos besoins.
la source