Jako prosty przykład chcę napisać skrypt CLI, który może drukować =
na całej szerokości okna terminala.
#!/usr/bin/env php
<?php
echo str_repeat('=', ???);
lub
#!/usr/bin/env python
print '=' * ???
lub
#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n '='; let x=$x+1 done; echo
Odpowiedzi:
tput cols
podaje liczbę kolumn.tput lines
podaje liczbę wierszy.źródło
echo -e "lines\ncols"|tput -S
aby uzyskać zarówno wiersze, jak i kolumny, patrz: linux.about.com/library/cmd/blcmdl1_tput.htmtput
to świetne polecenie z wieloma poleceniami do odczytywania stanu terminala, kontrolowania właściwości kursora i tekstu i tak dalej.alias dim="echo $(tput cols)x$(tput lines)"
:, który może spowodować80x50
.alias dim='echo Terminal Dimensions: $(tput cols) columns x $(tput lines) rows'
W bash, zmienne środowiskowe
$LINES
i$COLUMNS
powinny być w stanie załatwić sprawę. Zostanie ustawiony automatycznie po każdej zmianie rozmiaru terminala. (tj. sygnał SIGWINCH )źródło
checkwinsize
opcję. Na przykład ten nieinteraktywny skrypt wyświetli wymiary terminala, na którym jest uruchomiony:shopt -s checkwinsize; (:); echo $LINES $COLUMNS
(checkwinsize
opcja inicjuje zmienne tylko po oczekiwaniu na zakończenie podpowłoki, dlatego potrzebujemy(:)
instrukcji)$LINES
i$COLUMNS
są aktualizowane poSIGWINCH
wysłaniu, w rzeczywistości po wykonaniu dowolnego interaktywnego polecenia. Jeśli próby aktualizacjiPS1
ztrap SIGWINCH
was nie może używać$LINES
i$COLUMNS
przechowywać je stare wartości ((LINES
iCOLUMNS
są ustawiane tylko jako zmienne powłoki przez bash. Bash nie ustawi ich jako zmiennych środowiskowych , chyba że wyeksportujesz te zmienne powłoki.I jest
stty
z coreutilsWyświetli liczbę wierszy i kolumn lub odpowiednio wysokość i szerokość.
Następnie możesz użyć albo
cut
albo,awk
aby wyodrębnić żądaną część.Dotyczy to
stty size | cut -d" " -f1
wysokości / linii istty size | cut -d" " -f2
szerokości / kolumnźródło
źródło
tr
komendą przez te wszystkie lata? (facepalm)yes '='
wyświetli nieskończoną liczbę wierszy „=”, a następujące polecenia zorganizują wystarczająco dużo, aby wypełnić terminalAby to zrobić w środowisku Windows CLI, najlepszym sposobem, jaki mogę znaleźć, jest użycie polecenia mode i parsowanie danych wyjściowych.
Mam nadzieję, że się przyda!
UWAGA : Zwrócona wysokość to liczba linii w buforze, a nie liczba linii widocznych w oknie. Jakieś lepsze opcje?
źródło
W systemie POSIX ostatecznie chcesz wywoływać wywołanie
TIOCGWINSZ
(Get WINdow SiZe)ioctl()
. Większość języków powinna mieć do tego jakieś opakowanie. Np. W Perlu możesz użyć Term :: Size :źródło
:io.columns
Erlang:io:columns().
erlang.org/doc/man/io.html#columns-0TIOCGWINSZ
w standardzie POSIX iioctl()
jest zdefiniowany tylko dla przestarzałej funkcji STREAMS.Jak wspomniałem w odpowiedzi Lyceusza, jego kod zawiedzie w nieanglojęzycznych ustawieniach regionalnych Windows, ponieważ wtedy wyjście
mode
może nie zawierać podciągów „kolumn” lub „linii”:Możesz znaleźć poprawny podciąg bez szukania tekstu:
Zauważ, że nawet nie zawracam sobie głowy liniami, ponieważ są niewiarygodne (a tak naprawdę nie dbam o nie).
Edycja: Zgodnie z komentarzami na temat systemu Windows 8 (oh ...
Przetestuj to, bo tego nie przetestowałem.
źródło
---
linię. i.imgur.com/4x02dqT.png$mode = `mode`; list($rows, $cols) = array_slice(preg_split('/\n/', substr($mode, strpos($mode, 'CON:'))), 2, 2);
. A potem po prostu wymieniam wszystko oprócz liczb.CON device status:
? Może dopasowanie czegoś podobnegoCON.*:
działałoby lepiej.Zainspirowany odpowiedzią @ pixelbeat, oto powstały poziomy pasek
tput
, niewielkie niewłaściwe użycieprintf
wypełnienia / wypełnienia itr
źródło
W niektórych przypadkach wiersze / LINIE i kolumny nie pasują do rzeczywistego rozmiaru używanego „terminala”. Być może nie masz dostępnego „tput” lub „stty”.
Oto funkcja bash, której możesz użyć do wizualnego sprawdzenia rozmiaru. To zadziała do 140 kolumn x 80 wierszy. W razie potrzeby możesz dostosować maksima.
źródło