экран /dev/pts/ виртуальной машины никогда не имеет правильных настроек stty

В пространстве zsh очень мало хороших примеров, а документация тупая. Я провел некоторое время, изучая, как Prezto использует zstyle, а также читая документацию и пробуя кое-что. zstyle, по-видимому, в основном используется в дополнениях, но на самом деле он действительно хорош для хранения данных более сложным способом, чем простые -старые -переменные окружения.

Эта суть показывает, как вы можете использовать zstyle для хранения и извлечения информации:

# reference: http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fzutil-Module

# list all zstyle settings
zstyle -L

# store value in zstyle
zstyle :example:favorites fruit apple

# store multiple values in zstyle
zstyle :example:list fruits banana mango pear

# retrieve from zstyle and assign new $fav variable with -g
zstyle -g fav ':example:favorites' fruit && echo $fav

# retrieve from zstyle and be explicit about the assignment data type:
# -a: array, -b: boolean, -s: string
zstyle -a :example:list fruits myfruitlist && echo $myfruitlist

# test that a zstyle value exists with -t
if zstyle -t ':example:favorites' 'fruit' 'apple'; then
  echo "an apple a day keeps the dr. away"
fi
if ! zstyle -t ':example:favorites:vegtable' 'broccoli' 'no'; then
  echo "Broccoli is the deadliest plant on Earth - why, it tries to warn you itself with its terrible taste"
fi

# delete a value with -d
zstyle -d ':example:favorites' 'fruit'

# list only zstyle settings for a certain pattern
zstyle -L ':example:favorites*'

0
15.12.2020, 23:08
2 ответа

Если вы настроите инициализацию интерактивной оболочки на выполнение resize, она запросит у терминала его размер и выполнит те же системные вызовы, что и stty.

Этот фрагмент в конце.bashrcбудет работать:

if [ -t 0 ] && [ -t 1 ] && [[ $TERM == screen* ]] && [ -f /usr/bin/resize ]; then
  resize >/dev/null
  # stty -a
fi

Он проверяет, являются ли стандартные входы/выходы терминалами (, т. е. является ли сеанс интерактивным ), установлен ли TERMодин из вариантовscreenи установлен ли resize.

Перенаправление вывода resizeне мешает его отправке управляющих последовательностей на терминал и получению ответа, потому что он открывает свой собственный поток для tty для этого.

Дополнительная литература:

1
18.03.2021, 22:49

тл;др; , чтобы внутренний терминал за последовательным соединением получал настройки размеров эмулятора терминала, поместите это в свой ./bashrc

set_terminal_dimension() (
  old="$(stty -g)"
  stty raw -echo min 0 time 1
  printf '\033[18t' >/dev/tty
  IFS=';t' read -r _ rows cols _ </dev/tty
  stty "$old";
  stty cols "$cols" rows "$rows"
)
PROMPT_COMMAND='set_terminal_dimension'

Справочная информация

При подключении к системе Linux на одном из ее serial connection(, т. е. /dev/ttyS0 ), обеспечивает поток байтовых данных ввода и вывода. Однако он не обеспечивает методы межпроцессного взаимодействия IPC (, такие как СИГНАЛЫ ). Следовательно, нет SIGWINCH , который бы:

The SIGWINCH signal is sent to a process when its controlling terminal changes its size (a window change).

Также, конечно, другой компьютер, который отображает вывод, полученный из последовательного соединения, не может выдавать настройки терминала (, например. через stty), так как это не та же машина.

Между двумя машинами :a )TARGET -Sys, обеспечивающая оболочку за последовательным соединением, и b )CONNECTING -Sys для чтения и записи в целевую систему через последовательное соединение, проблема это:

В системе «a )TARGET» запущена оболочка, для которой необходимо установить правильную информацию о соединениях (, т.е. это возможно с помощью утилиты командной строкиstty). Он не может знать размеры того, сколько символов может отображаться на экране(colsи rows, что известно только системе "b )ПОДКЛЮЧЕНИЕ" -и точнее ее приложению-эмулятору терминала )..

Системы a )и b ), связанные двумя байтовыми потоками i )ввода и ii )вывода, должны обмениваться информацией cols, rowsпо одному и тому же потоку, в первую очередь видит, что ввод с клавиатуры отправляется, а вывод принимается из системы «)TARGET». Ясно, что этот обмен информацией может конфликтовать с уже отправленными обычными байтами, поэтому можно использовать протокол, в котором информация пытается быть специально помечена с помощью последовательностей управляющих байтов. Как указано в этом ответе , последовательная связь в отличие от соединения ssh (также соединяет две системы ), не настраивается с помощью специального протокола, такого как NAWS (, см. ответ на вопрос «Как длина и ширина терминала пересылаются через SSH и telnet?").

Другой ответ здесь предлагает готовую программу resize, которая часто упаковывается дистрибутивами. Этот ответ предлагает более легкие -варианты веса, которые могут больше соответствовать « без -излишеств -уменьшить -пакет -зависимости « -подход, который можно было бы ожидать во многих системах, использующих последовательную связь через графический интерфейс (, например, Xorgсервер)

В Wiki Archlinux в разделе «Работа с последовательной консолью» в разделе «Устранение неполадок» в дополнение упоминается команда resize, которая во многих дистрибутивах включена в пакеты для xterm. Поскольку использование последовательного соединения часто совпадает с отсутствием необходимости в графическом выводе / графическом интерфейсе в системе, к которой подключается через последовательное соединение, решение xtermможет быть довольно чрезмерным решением (дает сервер Xorg.... будучи зависимостями от пакетов ).

Поэтому по поводу габаритов терминала об этом сказано там

  1. If you don't want to install xterm, it is possible to do the same work via a shell function. Put the following function into your zshrc and invoke it without parameters after resizing the terminal emulator's window:

Приведенное здесь решение также проливает больше света на то, как Терминал запрашивает и получает ответ от эмулятора терминала на другой стороне.Более легкое -весовое решение может быть похоже на этот скрипт bash/bin/sbin/resize.sh:

#!/bin/bash

## store tty settings before
old="$(stty -g)"

## briefly disable any stty setting, like echo or line discipline
## because for a brief moment a escape sequence is send (to be received
## by the receiver (a terminal emulator program)
## a) raw => no line discipline
## b) -echo => disable repeating and display stuff 
## c) min 0 time 1 => return a read with after 1 tenth of a sec and no minimum bytes 
stty raw -echo min 0 time 1

## send the request an escape sequence for the outer terminal emulator
printf '\033[18t' >/dev/tty

## use read shell builtin to read the return into the variables rows, cols
## (IFS is used in combination with a "_" (as "garbage variable") to 
##  get rid of not neede part of response)
IFS=';t' read -r _ rows cols _ </dev/tty

## (previous settings are restore, ie. the "raw" and "-echo" is undone)
stty "$old";

## finally the received info ( the info provided via the same stream
## of bits as bytes as also actually incoming the bytes generated by the 
## keyboard ) and which was read into the variables was set before
stty cols "$cols" rows "$rows"
0
18.03.2021, 22:49

Теги

Похожие вопросы