当你从 Windows 的 Putty,Xshell 上连接 Linux 服务器时,Putty, Xshell 这些就可以理解是个终端,一般名字如 pts/1, pts/2 等,当你按下 Ctrl + Alt +F[1~6] 进行切换时,得到的也是一个终端,名字如 tty1, tty2 等。在这些终端窗口里,你会输入内容,如果发现所输入的某些内容不正确时,你可能会用退格键也可能会用 del 键将它们删除;你还会按下 Ctrl + C 组合键来终端一个正在运行着的程序,也会按下 Ctrl + Z 来让一个正在运行的程序挂起,等等这些都是一个终端的属性。
stty 就是用来设置这些终端的属性命令。一般情况下,这些预设已经很完善,并不需要我们修改,但是在某些场合,也会根据需要做一些针对性改变。使用 stty -a 可以查看到当前的终端设置,如:stty -a
speed 38400 baud; rows 28; columns 115; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; 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 -iutf8
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 可见选项非常多。比如上面的 intr = ^C 表示发出的中断信号为 Ctrl + c ,这里的 ^ 符号表示的就是 Ctrl 键。你可以对此进行修改:stty intr = ^k ,这样之前需要按下 Ctrl + c 才可以中断程序运行的组合键现在就变成了 Ctrl + k 。
可以如下查看某个终端的设置信息,如:beyes@linux-xh53:~> stty < /dev/pts/0
speed 38400 baud; line = 0;
-brkint -imaxbel 上面查看终端 /dev/pts/0 的信息。
往往在一些需要读入用户密码的脚本里需要使用到该命令。先看下面一个脚本,它读入用户密码,然后输出这个密码:
[Bash shell] 纯文本查看 复制代码 #!/bin/sh
echo "Enter password: "
read PASSWD
echo $PASSWD
运行脚本:beyes@linux-xh53:~> sh stty.sh
Enter password: #输入密码
hello world #这个不好,密码被显示出来了
hello world 像上面,我们一般不愿意在输入密码时密码会直接显示在屏幕上,那么可以在脚本里使用 stty 来屏蔽这个回显功能:
在脚本里使用该命令,一般事先需要做好备份,以便在设置后恢复,那么可以在脚本里加上这么一句:这样就相当于取消了回显功能,此时你再运行脚本并输入密码时,密码是不会显示在屏幕上了。但是我们只是希望在输入密码时使用该屏蔽功能,而在别的时候,还是能够正常的显示出输入的内容,比如用户名,那么就需要在脚本里事先对终端设置进行备份,然后修改设置,最后回复设置,比如下面这样:
[Bash shell] 纯文本查看 复制代码 #!/bin/sh
OLDCONFIG=`stty -g`
stty -echo
echo "Enter password: "
read PASSWD
echo $PASSWD
stty $OLDCONFIG
上面脚本中,stty -g 将当前终端的配置输出并保存在 OLDCONFIG 变量中,在最后一句时回复先前设置。
cbreak 选型和 icanon 是相同的,它们的功能都是使能 erase (向后删除字符), kill(删除整条命令) 这些特殊字符(可用 stty -a 查看其组合键)。默认情况下是使能的,如果使用 -icanon 那么就是禁用这些功能,下面测试这个选项。
测试脚本如下:
[Bash shell] 纯文本查看 复制代码 #!/bin/sh
read val
echo $val
这是正常的情况,它通过终端读入内容存往变量 $val 中。如果我们觉得输入的字符不正确时,我们可以使用退格将之删除。但是当我们使用 -icanon 时,退格键就失去了作用,同样整行删除组合键(Ctrl + u) 也失效。修改上面脚本如下:
[Bash shell] 纯文本查看 复制代码 #!/bin/sh
SAVEDSTTY=`stty -g`
stty -icanon
read val
echo $val
stty $SAVEDSTTY
这么做之后,当我们再使用退格键时,会看到:
上图中的 ^? 字符就是退格键所代表的字符,但此时已经不能删除掉输入的字符 k 。
这里还介绍一个更实用的功能,就是如何在命令行里恢复正常设置。比如你弄乱了回车键的回车功能,不但如此,还可能添加了一些其它的设置,现在感觉一切变得很糟糕,想敲些什么命令时,但回车都不管用了,怎么办?这里,一般的,组合键 Ctrl + J 就相当于一个回车,并且都可以被识别,那么要回复初始设置,可以:
1. 按下 Ctrl + J
2. 输入 stty sane
3. 再按下 Ctrl + J
这样,就可以恢复预设了。
stty 的选项相当多,具体的可以参考说明手册。 |