stty命令用于设置terminal的行为模式和控制字符。
如果设置了stty erase ^H
,则用退格键(Backspace)删除字符。
如果设置了stty erase ^?
,则用删除键(Delete)删除字符。
如果设置了stty echoe
,则用退格键删除字符时,屏幕上的字符也会消失——这是我们常见的情况。
但如果设置了stty -echoe
,则用退格键删除字符时,屏幕上被删除的字符不会立即消失。
"echoe"和"-echoe"其实是一组相反的设置。
上面的"^H"和"^?"其实是一些预定义的特殊ASCII字符。
^H
: BS, Backspace^?
: DEL^M
: Carriage Return (回车)^J
: Line Feed (换行)^I
: Tab^[
: Escape^G
: bell, BEL^@
: NUL参见 Control Character @ Wikipedia
如果设置了stty -echo
,会发现用户输入的命令不再显示在显示屏上。恢复到“正常”模式用stty echo
重新设置。
通常默认设置里都有stty kill ^U
,这意味着你可用Ctrl+U
快速删除当前命令行的内容。
用命令stty -a
可以显示当前的所有设置。
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = ; eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
其中:
有时屏幕无缘无故地没响应了,那也许是你按了 stop 对应的按键(比如 ^S,即Ctrl+S)了。
^D
: EOF,结束用户输入^C
: 中断当前程序^U
: 删除当前命令行引自Wikipedia的一段例程,提示用户输入密码而不回显,就像登录shell时那样。
#!/bin/bash # Reading a password without echoing it while typed old_term_settings=$(stty -g) # 保存 stty 状态 stty -echo # 关闭屏幕回显 read -p 'Password: ' secret_passwd # 或者: echo -n 'Password: '; read secret_passwd echo echo Your password is ${secret_passwd}. stty "$old_term_settings" # 恢复 stty 状态