`stty -echo; 是如何工作的?猫-v; stty echo` 可以回显特殊键吗?

`stty -echo; 是如何工作的?猫-v; stty echo` 可以回显特殊键吗?

stty -echo; cat -v; stty echo是一种查看您发送到终端的密钥的技术。但我只是想知道这个命令是如何工作的?当我删除它时,stty -echo它将打印您输入的内容的两倍。我知道stty -echo正在禁用终端打印您输入的内容。更具体地说,我的追求是“为什么我可以使用‘;’连接命令以实现先禁用回显然后在 cat -v 命令后打开?”或者与“;”有任何关联吗?根本吗?

答案1

;只是分隔命令,以便它们一个接一个地运行。

在这里,如果您在交互式 shell 的提示符下输入该命令,只要您cat正常退出(使用Ctrl+D两次,或按空键),当您返回到提示符时,终端设备本地回显将被禁用并重新启用。线)。

如果cat用 SIGINT 或 SIGQUIT 中断(如果按Ctrl+CCtrl+ \),shell 会bash取消整个命令行,因此该stty echo命令将不是运行,并且本地回显不会重新启用。

zshshell 中,你可以这样做:

STTY=-echo cat -vt

这是仅在命令持续时间内更改某些 tty 设置的特殊语法。这样,即使cat中断,tty 设置也会恢复。

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

zsh(与s相反STTY,它不处理作业暂停(例如Ctrl+ ))。Z

如果将其更改为STTY='-echo -isig',您将能够看到Ctrl+C发送的字符。

有了STTY='raw -echo',你就可以看到全部字符(并且未经 tty 行规则修改,并且一旦输入它们),但随后您将无法终止cat.

但您可以在 3 秒不活动后退出STTY='raw -echo time 30 min 0'cat

相关内容