Linux深入探索01-stty与键盘信号

----- 最近更新【2021-12-20】-----

本文目录结构预览:

  • 一、简介
  • 二、stty语法
    -三、常见的键映射
  • 四、stty使用
    1、查看键映射
    2、修改键映射
    3、其它设置
  • 五、常见键盘映射问题
    1、解决 backspace 键映射问题
    2、封闭 eof
    六、参考

一、简介

最初的 Unix 设定假定人们使用终端连接主机计算机。30 多年过去后,情况依然如此,即便是在自己的 PC 机上运行 Unix。多年以来,终端发展为许多不同的类型,并且提供了许多不同类型的键盘,但是Unix一直能够很好地使用它们。这是因为 Unix 使用了一个键盘映射系统,该系统非常灵活,可以用于任何类型的键盘。

所谓的键盘映射系统也就是使用一组标准的键盘信号。尽管这些信号是标准的,但是发送这些信号所需按下的键却可以根据需要修改,而 GNU 所提供的 stty(set tty) 则是可以对这些按键进行修改的工具。

通俗一点来说,键盘映射就是当你按下某个或者某些按键的时候,就会给你的系统发送设定的信号。比如在 Unix 中,<Ctrl-C>字符映射到 intr(interrupt,中断) 信号上。这也就是说,当按下 <Ctrl-C> 时,它的效果就是发送 intr(终止程序) 信号。

本节要介绍的stty命令就是可以用来查看或者修改当前的键盘映射。

注:
<Ctrl-C>表示按住键盘的Ctrl键并按下C字母键。当然,还有一些其它的表示方法,如:^C 或者Ctrl-C等。

二、stty 语法

stty - change and print terminal line settings(stty命令用于显示和修改终端行设置)

Usage: stty [-F DEVICE | --file=DEVICE] [SETTING]...
  or:  stty [-F DEVICE | --file=DEVICE] [-a|--all]
  or:  stty [-F DEVICE | --file=DEVICE] [-g|--save]

更详细的用法可以使用 man stty 或者 stty --help 查看。

三、常见的键映射

如下所列出的键映射都是最常见的键映射,但是它们不是固定的。

信号 作用
erase <Backspace> / <Delete> / ^H 删除键入的最后一个字符
werase ^W 删除键入的最后一个单词
kill ^X / ^U 删除整行
intr ^C 停止正在运行的程序
quit ^\ 停止程序并保存core文件
stop ^S 暂停屏幕显示
start ^Q 重新启动屏幕显示
eof ^D 指示已经没有数据(停止shell,即退出登录)
susp ^Z 暂停一个程序(挂起)

注:
由于字面意思的理解,kill键盘信号很容易被误认为是停止程序,但它的作用只是删除你刚键入的一行。为了停止程序的话,你需要使用的是intr信号。

四、stty使用

1、查看键映射

使用stty -a查看系统的键盘映射情况

root@instance-2:~# stty -a
speed 38400 baud; rows 23; columns 110; 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; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar 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 -flusho -extproc

注:
这个^?并不是一个真正的键组合。也就是你不能按住<Ctrl>键再按?(问号)键。^?表示“whichever key on your keyboard that sends the code that used to be called DEL(你的键盘上某个用来发送DEL代码的键)”。

需要时,这里显示的各种选择都可以重新配置。每种终端选项都有自己的名字(如ixon),其中大多数要么被设置要么被清除。在stty中相应选项前冠以负号(-),该选项被清除(禁止);如果无负号,该选项被设置。 当希望修改各选择的值时,应在stty命令中正确书写相应选项。如:

$ stty -ixon    # 将流控制设置为OFF
$ stty ixon    # 则将其置为ON。在stty命令中可以同时设置多个选项: 
$ stty ixon 1200    # 该命令将终端设置为1200波特,并将流控制置为ON。

2、修改键映射

修改键映射,只需要使用命令stty,后面跟着要修改信号的名称,然后是新的键赋值即可。

例如,将kill信号修改为^U的命令如下:

stty kill ^U

3、其它设置

1)回显设置

stty -echo    #关闭回显。比如在脚本中用于输入密码时。
stty echo     #打开回显。

2)打印当前终端的大小(行数和列数)

root@Chan:~# stty size
38 191

3)在命令行下禁止输出小写

stty olcuc     #开启
stty -olcuc    #恢复

4)忽略回车符

stty igncr    #开启
stty -igncr   #恢复

五、常见键盘映射问题

1、解决 backspace 键映射问题

1)在 linux/unix 平台上的命令行界面中:
当你输错了字符,要想删除,然后习惯性的按下backspace键后,发现非但没有删除想要删掉的字符,还多出了两个字符^H

2)问题原因:
在你的计算机上<backspace>键等同于^H,但是在远程主机上^H键没有被映射到erase信号上(^?映射到erase上了)。

3)解决方法:
方法一:
修改连接远程主机的程序的配置(如你使用的 ssh 客户端程序)。大多数通信程序允许控制<Backspace>键发送^H还是发送^?
方法二:
这可以通过使用 stty 命令修改 tty 终端的设置来实现 backspace 删除功能。

stty erase ^H

如果你希望下次登录时还是使用这个设置,这时你需要将这条设置命令放置到你的初始化文件中(一般是你的.profile 文件)。

2、封闭 eof

大部分shell是用^D来映射 eof信号,但有些时候你只是不小心按了<Ctrl-D>,然后就给你注销登录了。
想要避免这种情况发生,可以设置让shell封闭eof信号。
在Bash shell中,可以设置环境变量$IGNOREEOF,方法如下:

linux1@noseeu:~$ export IGNOREEOF=5
linux1@noseeu:~$ echo $IGNOREEOF
5
linux1@noseeu:~$ Use "logout" to leave the shell.
linux1@noseeu:~$ Use "logout" to leave the shell.
linux1@noseeu:~$ Use "logout" to leave the shell.
linux1@noseeu:~$ Use "logout" to leave the shell.
linux1@noseeu:~$ Use "logout" to leave the shell.
linux1@noseeu:~$ logout

连接断开

此时,你只有连续按5次<Ctrl-D>才会注销你的登录。

六、参考

书箱:《Unix & Linux 大学教程》第七章 (美)Harley Hahn 著 张杰良 译
GNU手册:man stty
中文手册:http://linux.51yip.com/search/stty
英文资料:The TTY demystified(解密TTY)
SegmentFault: Linux TTY/PTS概述

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355

推荐阅读更多精彩内容