![`stty -echo; 是如何工作的?猫-v; stty echo` 可以回显特殊键吗?](https://linux22.com/image/182976/%60stty%20-echo%3B%20%E6%98%AF%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%E7%9A%84%EF%BC%9F%E7%8C%AB-v%EF%BC%9B%20stty%20echo%60%20%E5%8F%AF%E4%BB%A5%E5%9B%9E%E6%98%BE%E7%89%B9%E6%AE%8A%E9%94%AE%E5%90%97%EF%BC%9F.png)
stty -echo; cat -v; stty echo
是一种查看您发送到终端的密钥的技术。但我只是想知道这个命令是如何工作的?当我删除它时,stty -echo
它将打印您输入的内容的两倍。我知道stty -echo
正在禁用终端打印您输入的内容。更具体地说,我的追求是“为什么我可以使用‘;’连接命令以实现先禁用回显然后在 cat -v 命令后打开?”或者与“;”有任何关联吗?根本吗?
答案1
;
只是分隔命令,以便它们一个接一个地运行。
在这里,如果您在交互式 shell 的提示符下输入该命令,只要您cat
正常退出(使用Ctrl+D两次,或按空键),当您返回到提示符时,终端设备本地回显将被禁用并重新启用。线)。
如果cat
用 SIGINT 或 SIGQUIT 中断(如果按Ctrl+C或Ctrl+ \),shell 会bash
取消整个命令行,因此该stty echo
命令将不是运行,并且本地回显不会重新启用。
在zsh
shell 中,你可以这样做:
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