linux-command 命令手册:stty 终端设置命令详解与实战

原创2026-10-02 13:48:451,097 阅读
文章标签:文档教程

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 的"开发使用"一节)。

使用建议与安全提示

  1. 务必成对使用:凡是使用 stty -xxx 关闭某项功能,都应在使用结束后立即用 stty xxx 或 stty "$old_stty_settings" 恢复,否则终端可能一直处于不回显、不换行等异常状态;
  2. 优先使用 read 的高级选项:实现超时读取(-t)、隐藏输入(-s)时,read 自带的选项更简单可靠,stty 方案更适合需要临时整体切换终端模式的场景;
  3. 关注终端类型差异:stty 的 iuclc、olcuc、igncr 等行为依赖具体终端驱动与伪终端实现,跨平台脚本中应先检测终端能力再做转换类操作;
  4. 用 stty -a 排查问题:当终端行为异常(如输入不回显、回车无效)时,优先执行 stty -a 检查当前全部设置,再针对 echo、icanon、icrnl 等关键项进行恢复。
登录后查看全文
linux-command