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 状态