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