Linux深入探索01-stty与键盘信号
----- 最近更新【2021-12-20】-----
一、简介
最初的 Unix 设定假定人们使用终端连接主机计算机。30多年过去后,情况依然如此,即便是在自己的PC机上运行Unix。多年以来,终端发展为许多不同的类型,并且提供了许多不同类型的键盘,但是Unix一直能够很好地使用它们。这是因为Unix使用了一个键盘映射系统,该系统非常灵活,可以用于任何类型的键盘。
所谓的键盘映射系统也就是使用一组标准的键盘信号。尽管这些信号是标准的,但是发送这些信号所需按下的键却可以根据需要修改,而GNU所提供的stty(set tty)则是可以对这些按键进行修改的工具。
通俗一点来说,键盘映射就是当你按下某个或者某些按键的时候,就会给你的系统发送设定的信号。比如在Unix中,字符映射到 intr(interrupt,中断) 信号上。这也就是说,当按下时,它的效果就是发送 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 | / / ^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)问题原因:
在你的计算机上键等同于^H
,但是在远程主机上^H
键没有被映射到erase
信号上(^?
映射到erase
上了)。
3)解决方法:
方法一:
修改连接远程主机的程序的配置(如你使用的ssh客户端程序)。大多数通信程序允许控制键发送^H
还是发送^?
。
方法二:
这可以通过使用stty命令修改tty终端的设置来实现backspace删除功能。
stty erase ^H
如果你希望下次登录时还是使用这个设置,这时你需要将这条设置命令放置到你的初始化文件中(一般是你的.profile文件)。
2、封闭 eof
大部分shell是用^D
来映射 eof
信号,但有些时候你只是不小心按了<Ctrl-C>
,然后就给你注销登录了。
想要避免这种情况发生,可以设置让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-C>
才会注销你的登录。
六、参考:
书箱:《Unix & Linux 大学教程》第七章 (美)Harley Hahn 著 张杰良 译
GNU手册:man stty
中文手册:http://linux.51yip.com/search/stty
英文资料:The TTY demystified(解密TTY)
SegmentFault: Linux TTY/PTS概述
Linux深入探索01-stty与键盘信号的更多相关文章
- Linux下多任务间通信和同步-信号
Linux下多任务间通信和同步-信号 嵌入式开发交流群280352802,欢迎加入! 1.概述 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式.信号可以直接进行用户空间进程和内核进程之间的 ...
- Linux 生产实习01
Linux 生产实习01 标签(空格分隔): Linux 2018.07.02 相关软件下载地址:Linux Study 0x01. 安装 VMware Workstation VMware Work ...
- Linux下对后台进程通过kill传递信号不起作用的问题
在阅读APUE信号一章时,我遇到Linux下对后台进程通过kill传递信号不起作用的问题 具体情形与如下链接中的老兄一致: http://bbs.csdn.net/topics/390335913?p ...
- Linux网络服务01——Linux网络基础设置
Linux网络服务01--Linux网络基础设置 一.查看及测试网络 1.使用ifconfig命令查看网络接口 (1)查看活动的网络接口 ifconfig命令 [root@crushlinux ~]# ...
- BlackArch Linux 2019.06.01 宣布发布
导读 BlackArch Linux是一个基于Arch Linux的发行版,专为渗透测试人员和安全研究人员设计,并包含大量渗透测试和安全实用程序,已宣布发布2019.06.01版本. BlackArc ...
- 〖Linux〗Ubuntu13.10中打开键盘背光灯
刚刚从淘宝上买回一个带有Led背光的键盘(黑爵战神x5 背光升级版): 然后发现在Linux中背光灯并不亮,在Windows中就可以按下Scroll Lock键点亮: 在网上探索了一番,觉得应该可以使 ...
- Linux 从头学 01:CPU 是如何执行一条指令的?
作 者:道哥,10+年的嵌入式开发老兵. 公众号:[IOT物联网小镇],专注于:C/C++.Linux操作系统.应用程序设计.物联网.单片机和嵌入式开发等领域. 公众号回复[书籍],获取 Linux. ...
- Linux深入探索04-Bash shell
----- 最近更新[2021-12-30]----- 本文目录结构预览: 一.简介 二.shell 变量 1.查看变量 2.变量类型 3.变量操作 4.系统常见的全局变量 三.shell 选项 1. ...
- linux下的僵尸进程处理SIGCHLD信号
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...
随机推荐
- 使用PostMan测试WebService接口教程
一.操作步骤 1.设置URL 2.设置请求模式:Post 3.设置Header:添加 Content-Type ,值为 text/xml;charset=utf-8 4.设置Body:勾选raw 5. ...
- 痞子衡嵌入式:把玩i.MXRT1062 TencentOS Tiny EVB_AIoT开发板(2) - 在Flash调试及离线启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1062 TencentOS Tiny EVB_AIoT开发板在Flash调试与离线启动. 腾讯 TencentOS 团队于 ...
- nim_duilib(17)之xml配置窗口调整大小
本文目标 xml配置窗口,使得窗口可以调整大小. sizebox windows的属性sizebo的作用就是设置窗口可以调整大小.鼠标放到窗口边缘,拖动窗口并改变大小. 一个例子 <Window ...
- 【LeetCode】Swap Nodes in Pairs 解题报告
Swap Nodes in Pairs [LeetCode] https://leetcode.com/problems/swap-nodes-in-pairs/ Total Accepted: 95 ...
- 【LeetCode】486. Predict the Winner 解题报告(Python)
[LeetCode]486. Predict the Winner 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: ht ...
- E. Congruence Equation
E. Congruence Equation 思路: 中国剩余定理 \(a^n(modp) = a^{nmod(p-1)}(modp)\),那么枚举在\([0,n-2]\)枚举指数 求\(a^i\)关 ...
- Unsupervised Feature Learning via Non-Parametric Instance Discrimination
目录 概 主要内容 Wu Z., Xiong Y., Yu S. & Lin D. Unsupervised Feature Learning via Non-Parametric Insta ...
- FreeBSD 物理机下显卡的配置
FreeBSD 已从 Linux 移植了显卡驱动,理论上,A 卡 N 卡均可在 amd64 架构上正常运行. 支持情况 对于 FreeBSD 11,支持情况同 Linux 内核 4.11: 对于 Fr ...
- Java程序设计基础作业目录(作业笔记)
持续更新中............. Java程序设计基础笔记 • [目录] 我的大学笔记>>> 第1章 初识Java>>> 1.1.4 学生成绩等级流程图练习 1 ...
- 《MySQL数据操作与查询》- 综合项目 - 学生管理系统
<MySQL数据操作与查询>综合项目需求 一.系统整体功能 维护学生信息.老师信息和成绩信息. 支持按多种条件组合查询学生信息和成绩信息. 二.系统的信息需求 一个班级有一个讲师一个班主任 ...