Como um exemplo simples, quero escrever um script CLI que possa ser impresso =
em toda a largura da janela do 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
Respostas:
tput cols
informa o número de colunas.tput lines
informa o número de linhas.fonte
echo -e "lines\ncols"|tput -S
para obter ambas as linhas e cols ver: linux.about.com/library/cmd/blcmdl1_tput.htmtput
é um ótimo comando com muitos comandos para ler o estado do terminal, controlar as propriedades do cursor e do texto e assim por diante.alias dim="echo $(tput cols)x$(tput lines)"
que pode resultar em80x50
.alias dim='echo Terminal Dimensions: $(tput cols) columns x $(tput lines) rows'
No bash, as variáveis ambientais
$LINES
e$COLUMNS
devem ser capazes de executar o truque. O valor será definido automaticamente após qualquer alteração no tamanho do terminal. (ou seja, o sinal SIGWINCH )fonte
checkwinsize
opção. Por exemplo, este script não interativo imprimirá as dimensões do terminal no qual é executado:shopt -s checkwinsize; (:); echo $LINES $COLUMNS
(acheckwinsize
opção inicializa apenas as variáveis após aguardar a conclusão de um subshell, e é por isso que precisamos da(:)
instrução)$LINES
e$COLUMNS
são atualizados após oSIGWINCH
envio, na verdade, após qualquer execução de comando interativa. Se você tentar atualizarPS1
comtrap SIGWINCH
você não pode usar$LINES
e$COLUMNS
, eles mantêm valores antigos ((LINES
eCOLUMNS
são definidas apenas como variáveis de shell por bash. O Bash não os definirá como variáveis de ambiente , a menos que você exporte essas variáveis de shell.E há
stty
, a partir de coreutilsEle imprimirá o número de linhas e colunas, ou altura e largura, respectivamente.
Então você pode usar
cut
ouawk
para extrair a parte que deseja.Isso é
stty size | cut -d" " -f1
para a altura / linhas estty size | cut -d" " -f2
para a largura / colunasfonte
fonte
tr
comando todos esses anos? (facepalm)yes '='
produzirá uma quantidade infinita de linhas '=' e os seguintes comandos se organizarão o suficiente para preencher o terminalPara fazer isso no ambiente da CLI do Windows, a melhor maneira de encontrar é usar o comando mode e analisar a saída.
Espero que seja útil!
NOTA : A altura retornada é o número de linhas no buffer, não é o número de linhas visíveis na janela. Alguma opção melhor por aí?
fonte
No POSIX, em última análise, você deseja chamar a chamada
TIOCGWINSZ
(Get WINdow SiZe)ioctl()
. A maioria dos idiomas deve ter algum tipo de invólucro para isso. Por exemplo, no Perl você pode usar o Term :: Size :fonte
:io.columns
Erlang:io:columns().
erlang.org/doc/man/io.html#columns-0TIOCGWINSZ
no padrão POSIX eioctl()
é definido apenas para o recurso STREAMS obsoleto.Como mencionei na resposta do lyceus, seu código falhará no código de idioma do Windows que não é o inglês, pois a saída de
mode
pode não conter as subseqüências "colunas" ou "linhas":Você pode encontrar a substring correta sem procurar texto:
Observe que eu nem estou me incomodando com as linhas porque não é confiável (e eu realmente não me importo com elas).
Edit: De acordo com comentários sobre o Windows 8 (oh você ...), acho que isso pode ser mais confiável:
Mas teste, porque eu não testei.
fonte
---
linha. i.imgur.com/4x02dqT.png$mode = `mode`; list($rows, $cols) = array_slice(preg_split('/\n/', substr($mode, strpos($mode, 'CON:'))), 2, 2);
. E então eu apenas substituo tudo, menos os números.CON device status:
? Talvez combinar algo comoCON.*:
funcionaria melhor.Inspirado na resposta de @ pixelbeat, aqui está uma barra horizontal criada por
tput
, um leve uso indevido deprintf
preenchimento / preenchimento etr
fonte
Existem alguns casos em que suas linhas / LINHAS e colunas não correspondem ao tamanho real do "terminal" que está sendo usado. Talvez você não tenha um "tput" ou "stty" disponível.
Aqui está uma função bash que você pode usar para verificar visualmente o tamanho. Isso funcionará até 140 colunas x 80 linhas. Você pode ajustar os máximos conforme necessário.
fonte