Występuje problem polegający na tym, że próbuję uzyskać rozmiar terminala za pomocą skryptów. Normalnie używałbym polecenia tput cols
wewnątrz konsoli, jednak chcę móc tę funkcję osiągnąć poprzez ścisłe używanie skryptów.
Obecnie jestem w stanie wykryć działającą konsolę i uzyskać ścieżkę do pliku. Jednak staram się wykorzystać te informacje, aby uzyskać szerokość konsoli. Próbowałem użyć tego polecenia tput
, ale jestem całkiem nowy w Linuksie / skryptach, więc tak naprawdę nie wiem, co robić.
Powodem tego jest to, że chcę mieć możliwość ustawienia wpisu cron, który co jakiś czas informuje konsolę o jego szerokości / kolumnach.
Oto mój kod do tej pory:
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)
Normalna wydajność TERMINAL
& TERMINALPATH
to i , na przykład &pts/terminalnumber
/dev/pts/terminalnumber
pts/0
/dev/pts/0
źródło
cron
praca ma kontrolowane terminale.Odpowiedzi:
tput
Komenda jest doskonałym narzędziem, ale niestety nie może pobierać aktualne ustawienia dla dowolnie wybranego terminalu.Powodem tego jest to, że odczytuje stdout dla cech terminalu, i tutaj również zapisuje swoją odpowiedź. Tak więc w chwili, gdy próbujesz uchwycić
tput cols
twój wynik, usunąłeś również źródło jego informacji.Na szczęście
stty
czyta standardowe celu ustalenia charakterystyki terminalu zamiast stdout , więc w ten sposób możesz uzyskać potrzebne informacje o rozmiarze:Nawiasem mówiąc, niepotrzebnie kłopotliwe jest pisanie tego jako
echo $(/usr/bin/tput cols)
.Dla każdego
echo $(some_command)
uruchomionego konstruktusome_command
i przechwytywania jego wyniku, który następnie przekazujeszecho
do wyjścia. W prawie każdej sytuacji można sobie wyobrazić, że równie dobrze mógłbyś po prostu uruchomićsome_command
i pozwolić, aby dostarczał swoją moc bezpośrednio. Jest bardziej wydajny i łatwiejszy do odczytania.źródło
tput
/nurses
? Mój (ncurses 6.0.20160625) robi TIOCGWINSZ na stderr, jeśli nie może tego zrobić na stdout.cols=$(tput cols)
lubcols=$(tput cols 2<> /dev/ttyx)
działa dobrze.ncurses 5.7.20100313
tutaj. Czy jesteś pewien,cols=$(tput cols 2<> /dev/tty1)
że nie działa dla ciebie?tput cols
czyta stderr . Muszę teraz wymyślić, jak przepisać moją odpowiedź ...stty size <"$terminal" | read rows columns
zamiast próbować analizowaćstty -a
tput cols
itput lines
zapytaj o rozmiar terminala (ze sterownika urządzenia końcowego, a nie samego terminala) z urządzenia końcowego na jego standardowym wyjściu, a jeśli standardowe wyjście nie jest urządzeniem końcowym, tak jak w przypadku,cols=$(tput cols)
gdy jest to rura, ze stderr.Tak więc, aby pobrać wartości z dowolnego urządzenia końcowego, musisz otworzyć to urządzenie na stderr
tput
:(tutaj otwarte w trybie tylko do odczytu, więc
tput
nie wyświetla tam swoich komunikatów o błędach).Alternatywnie możesz być w stanie użyć
stty size
.stty
odpytuje terminal na standardowym wejściu:Żadne z nich nie są standardowe, więc może (i w praktyce) nie działać na wszystkich systemach. Powinien być jednak dość przenośny na systemy GNU / Linux.
Do
stty size
POSIX zażądano dodania lub innej metody zapytania o rozmiar terminala, ale wydaje się, że dyskusja nigdzie się nie kończy.źródło
Ten skrypt:
Pracowałem tutaj z absolutnie niczym więcej .....
Dlaczego ustawiasz zmienną środowiskową za pomocą danych? COLUMNS = $ (/ home / test / Documents / get_columns.sh)
Czy próbujesz uzyskać kolumny i wiersze z innego skryptu lub tty? Czy to to? Wciąż dziwne dla mnie, ponieważ ustawiasz zmienną środowiskową kolumn dla lokalnego skryptu ...
źródło
cron
zadania OP dla konkretnego terminala.cron
sprawdza konkretny terminal pod kątem jego właściwości. (Nie jestem do końca pewien, dlaczego musi to robić, ale tego właśnie chce OP).Moja odpowiedź różni się od odpowiedzi Roaimy, ponieważ jest dynamiczna. Jego / Jej odpowiedź daje rozmiar terminalu podczas tworzenia. Jeśli na przykład używasz menedżera okien sąsiadujących, takiego jak i3 lub bspwm, wolisz mieć bieżącą szerokość terminala. Dlatego używam ssty z pakietu coreutils:
Rozwiązanie Luciano działa bez zarzutu w terminalach xterm i xfce4. Nie wiem, czy wszystkie terminale ustawiają zmienną $ COLUMNS.
źródło