Как `stty -эхо; кот -в; stty echo `работает для эха специальных клавиш?

$ perl -MText::CSV_XS=csv -e'csv(in=>csv(in=>"file",sep=>";",allow_whitespace=>1),sep=>";",quote_space=>0);'
some name;another thing;random;value value value value value
0
07.11.2020, 06:33
1 ответ

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

Здесь, если вы введете это в приглашении интерактивной оболочки, локальное эхо терминального устройства будет отключено и снова включено к тому времени, когда вы вернетесь к приглашению, пока вы выходите catв обычном режиме (с Ctrl + D два раза или на пустой строке ).

Если catпрерывается сигналом SIGINT или SIGQUIT (, если нажать Ctrl + C или Ctrl + \), такие оболочки, как bash, отменяют всю командную строку, поэтому команда stty echoбудет не запущена, и локальное эхо не будет повторно включено.

В оболочке zshвы могли бы сделать вместо этого:

STTY=-echo cat -vt

Специальный синтаксис для изменения некоторых настроек tty только на время действия команды. Таким образом, настройки tty будут восстановлены, даже если catбудет прервано.

Хотя zshв любом случае всегда восстанавливает локальное эхо tty.

В bashвы могли бы сделать что-то подобное с вспомогательной функцией:

with_different_tty_settings() (
  tty_settings=$(stty -g) # save current settings
  trap 'stty "$tty_settings"' INT EXIT QUIT
  set -o noglob
  local IFS
  stty $STTY # split $STTY on default IFS characters
  "$@"
)

И вызовите catкак:

STTY=-echo with_different_tty_settings cat -vt

(в отличие от zshSTTY, он не обрабатывает приостановку задания (с Ctrl + Z , например )хотя ).

Если вы измените его на STTY='-echo -isig', вы сможете увидеть, какой символ Ctrl + C отправляет.

С помощью STTY='raw -echo'вы сможете видеть все символы (и не измененные дисциплиной линии tty, и как только вы их введете ), но тогда вы не сможете не иметь возможности прекратить cat.

Но вы можете выполнить STTY='raw -echo time 30 min 0', чтобы catвыйти через 3 секунды бездействия.

1
18.03.2021, 22:51

Теги

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