Я столкнулся с проблемой, когда я пытаюсь получить размер терминала с помощью сценариев. Обычно я использую команду tput cols
внутри консоли, однако я хочу иметь возможность выполнить эту функцию, строго используя сценарии.
На данный момент я могу определить работающую консоль и получить путь к файлу. Однако я изо всех сил пытаюсь использовать эту информацию, чтобы получить ширину консоли. Я пытался использовать команду tput
, но я довольно плохо знаком с Linux / скриптами, поэтому не знаю, что делать.
Причина для этого в том, что я хочу иметь возможность настроить запись cron, которая время от времени уведомляет консоль о ее ширине / столбцах.
Это мой код до сих пор:
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)
Нормальный вывод TERMINAL
& TERMINALPATH
есть и , например &pts/terminalnumber
/dev/pts/terminalnumber
pts/0
/dev/pts/0
источник
cron
рабочих мест были контрольные терминалы.Ответы:
Команда
tput
является отличным инструментом, но, к сожалению, она не может получить фактические настройки для произвольно выбранного терминала.Причина этого в том, что он читает стандартный вывод для характеристик терминала, и это также то, где он пишет свой ответ. Таким образом, в момент, когда вы пытаетесь захватить вывод,
tput cols
вы также удалили источник его информации.К счастью,
stty
читает stdin, а не stdout для определения характеристик терминала, поэтому вы можете получить необходимую информацию о размере:Кстати, излишне громоздко писать это как
echo $(/usr/bin/tput cols)
.Для любой конструкции
echo $(some_command)
вы выполняетеsome_command
и захватываете ее выходные данные, которые затем передаетеecho
в выходные данные. Вы можете себе представить, что почти в любой ситуации вы просто запускаетеsome_command
и позволяете ему напрямую выводить результаты. Это более эффективно, а также легче читать.источник
tput
/nurses
? Мой (ncurses 6.0.20160625) делает TIOCGWINSZ на stderr, если он не может сделать это на stdout.cols=$(tput cols)
илиcols=$(tput cols 2<> /dev/ttyx)
работает просто отлично.ncurses 5.7.20100313
здесь. Вы уверены,cols=$(tput cols 2<> /dev/tty1)
что не работает для вас?tput cols
это читать STDERR . Теперь мне нужно решить, как переписать мой ответ ...stty size <"$terminal" | read rows columns
вместо того, чтобы пытаться разобратьstty -a
tput cols
иtput lines
запросить размер терминала (из драйвера терминального устройства, а не самого терминала) у терминального устройства на его stdout, и, если stdout не является терминальным устройством, как в случае,cols=$(tput cols)
где это тогда канал, из stderr.Таким образом, чтобы извлечь значения из произвольного оконечного устройства, вам нужно открыть это устройство в строке
tput
:(здесь открывается в режиме только для чтения, поэтому
tput
там не выводятся сообщения об ошибках).Кроме того, вы можете использовать
stty size
.stty
запрашивает терминал на stdin:Ни один из них не является стандартным, поэтому может (и на практике не будет) работать на всех системах. Он должен быть достаточно переносимым для систем GNU / Linux.
В
stty size
POSIX было запрошено добавление или другой метод для запроса размера терминала, но обсуждение, похоже, никуда не денется.источник
Этот скрипт:
Работал здесь абсолютно ничего больше .....
Почему вы устанавливаете переменную среды с данными? COLUMNS = $ (/ дома / испытания / Документы / get_columns.sh)
Вы пытаетесь получить столбцы и строки из другого скрипта или tty? Это оно? Все еще странно для меня, потому что вы устанавливаете переменную окружения столбцов для локального сценария ....
источник
cron
для конкретного терминала.cron
Работа запрашивает конкретный терминал для его характеристик. (Я не совсем уверен, почему он должен это делать, но это то, чего хочет ОП.)Мой ответ отличается от ответа Роймы, так как он динамичен. Его / Hers ответ дает вам размер терминала при создании. Если вы, например, используете менеджер окон, например i3 или bspwm, вы бы предпочли иметь текущую ширину терминала. Поэтому я использую ssty из пакета coreutils:
Решение Лучано работает безупречно в xterm и xfce4-терминал. Я не знаю, все ли терминалы устанавливают переменную $ COLUMNS.
источник