linux-command 命令手册:stty 终端设置命令详解与实战
linux-command 命令手册:stty 终端设置命令详解与实战
本文基于 linux-command 仓库 command/stty.md 文档整理。
stty用于修改终端命令行的相关设置,是 shell 脚本实现交互式输入、密码回显控制、超时读取等能力的底层基石。读完本文,你将掌握 stty 的语法与核心选项,并能在脚本中通过-echo、icanon、min/time等组合实现"隐藏输入、定时输入、忽略回车"等实战效果。
命令概览
stty 命令(set teletype)用于修改终端命令行的相关设置,它直接操作终端驱动(tty 设备)的参数,控制输入输出的行为,如回显、大小写转换、特殊控制字符、读入模式等。该命令在 linux-command 的 dist/data.json 索引中被收录,描述为"修改终端命令行的相关设置",是 Linux 系统管理与 Shell 脚本编写中经常被忽略却极其关键的工具。
语法
stty(选项)(参数)
选项
-a:以容易阅读的方式打印当前的所有配置;
-g:以stty可读方式打印当前的所有配置。
-a(all):以人类可读的格式输出终端全部设置,适合日常巡检,例如:
$ stty -a
speed 38400 baud; rows 24; columns 80;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; ...
-g(generate):以 stty 自身可以再次解析的紧凑格式输出当前设置,多用于脚本中"保存现场、事后恢复",例如后文"定时输入"一节中的old_stty_settings=$(stty -g)用法。
参数
终端设置:指定终端命令行的设置选项,可以是控制字符定义(如 eof ^D)、模式开关(如 echo、-echo、icanon、igncr)、或 size 等只读查询子命令。
控制字符与输出大小写转换
禁止输出大写 / 小写
在命令行下,禁止输出大写的方法:
stty iuclc #开启:把输入的大写自动转换为小写
stty -iuclc #恢复
iuclc(input upper-case to lower-case)控制输入时大小写转换;同理可禁止输出小写:
stty olcuc #开启:把输出的小写自动转换为大写
stty -olcuc #恢复
olcuc(output lower-case to upper-case)作用于输出方向。注意:此类转换会影响终端字符流的实际内容,一般仅用于特殊演示或兼容旧设备,生产脚本中应保持默认关闭状态,用完务必用带 - 前缀的写法恢复。
获取终端尺寸与特殊控制字符
打印终端的行数和列数
stty size
执行后会直接输出两个数字,例如 24 80,分别代表行数与列数。脚本中可用 read rows cols < <(stty size) 快速取得终端尺寸,用于排版输出。
改变 Ctrl+D 的 EOF 含义
stty eof "string"
系统默认使用 Ctrl+D 表示文件输入结束(EOF),通过 eof 参数可以将其改写为任意字符串。修改后,当输入该字符串时即视为输入结束;要恢复默认可用 stty eof "^D"。该能力在自定义交互协议或测试输入结束条件时很有用。
回显控制:实现密码隐藏输入
屏蔽显示
stty -echo #禁止回显:键入的字符不会显示在终端上
stty echo #打开回显
echo 模式决定键盘输入是否即时回显到屏幕。在 command/read.md 文档中,仓库给出了一个"终端输入密码时不让密码显示出来"的脚本示例,正是借助 stty 实现的:
#!/bin/bash
stty -echo
read -p "输入密码:" pwd
stty echo
echo
echo 输入完毕。
其中,选项 -echo 禁止将输出发送到终端,而选项 echo 则允许发送输出。
交互测试方法
stty -echo;read;stty echo;read
该命令先关闭回显执行一次 read(输入的内容不显示),随后恢复回显再执行一次 read,可以直观对比两种模式下输入的差异。这是验证回显行为最快捷的测试方式。
忽略回车符
stty igncr #开启:忽略输入中的回车符 CR
stty -igncr #恢复
igncr(ignore carriage return)让终端在输入时忽略回车字符,常用于处理以 \r\n 换行的文本数据(如 Windows 风格文件或串口设备输入),避免回车符被当作普通输入字符混入数据流。
定时输入:基于 min/time 的读入等待
stty 的非规范(non-canonical)模式参数 icanon 与 min、time 组合,可以精确控制"读取多少字节、等待多久":
timeout_read()
{
timeout=$1
old_stty_settings=`stty -g` #save current settings 保存当前终端设置
stty -icanon min 0 time 100 #set 10seconds,not 100seconds 关闭规范模式,min=0 表示不要求有数据,time 单位为十分之一秒(100 即 10 秒)
eval read varname #=read $varname 读取输入
stty "$old_stty_settings" #recover settings 恢复原终端设置
}
要点说明:
stty -g输出的是可被 stty 直接解析的紧凑配置串,脚本结束时用stty "$old_stty_settings"恢复,避免终端状态被"污染";-icanon关闭规范模式(canonical mode),进入非规范模式后,输入不再等待回车才交付,而是按min与time的规则返回;time的单位是十分之一秒,time 100即 10 秒超时;min 0表示即使没有任何输入,超时后也会立即返回;- 更简单的方法就是利用 read 命令的
-t选项:
read -t 10 varname
read -t 直接以秒为单位指定等待时间,语义更清晰,是日常脚本中实现"超时读入"的首选方式(详见 command/read.md 中 -t:指定读取值时等待的时间(秒) 的说明)。而 stty 的 min/time 方案适合需要精确控制字符读取、或需要临时切换终端模式的底层场景。
仓库中的实际应用与延伸阅读
在本仓库中,stty 文档位于 command/stty.md,与其配套的 command/read.md 共同构成"终端交互输入"的知识闭环:read 负责从键盘读取变量值(含 -p 提示符、-t 超时、-a 数组、-s 静默等选项),而 stty 负责更底层的终端行为控制,二者结合可写出健壮的交互式脚本。
仓库的构建脚本 scripts/build.mjs 会扫描 command 目录下所有 Markdown 文档,生成 dist/data.json 索引与静态站点;在索引中,stty 条目被记录为 修改终端命令行的相关设置,可通过仓库生成的 Web 版或 npm install linux-command 后以 require("linux-command/command/stty.md") 的方式直接引用本文档的 Markdown 原文(参见 README.md 的"开发使用"一节)。
使用建议与安全提示
- 务必成对使用:凡是使用
stty -xxx关闭某项功能,都应在使用结束后立即用stty xxx或stty "$old_stty_settings"恢复,否则终端可能一直处于不回显、不换行等异常状态; - 优先使用 read 的高级选项:实现超时读取(
-t)、隐藏输入(-s)时,read自带的选项更简单可靠,stty 方案更适合需要临时整体切换终端模式的场景; - 关注终端类型差异:stty 的
iuclc、olcuc、igncr等行为依赖具体终端驱动与伪终端实现,跨平台脚本中应先检测终端能力再做转换类操作; - 用
stty -a排查问题:当终端行为异常(如输入不回显、回车无效)时,优先执行stty -a检查当前全部设置,再针对echo、icanon、icrnl等关键项进行恢复。