Linux resize命令详解

resize命令用于调整终端窗口大小,更新终端环境变量以匹配实际窗口尺寸,确保命令行界面正确显示内容。

命令简介

resize 是Linux/Unix系统中用于调整终端窗口大小的实用工具。它主要更新TERM环境变量中的终端尺寸信息,告诉系统当前终端窗口的行数和列数,从而确保命令输出、文本编辑器等应用程序能够正确适应终端窗口大小。

命令语法

resize [选项]

选项说明

选项 说明
-u 使用Bourne shell语法设置环境变量(默认)
-c 使用C shell语法设置环境变量
-s 显示当前终端尺寸信息,但不设置环境变量
-C 使用C shell语法,与-c相同
-v 显示详细输出信息
-h, --help 显示帮助信息
-V, --version 显示版本信息

常用操作示例

示例1:调整终端窗口大小(默认)

自动检测并调整终端尺寸:

resize

自动检测当前终端窗口大小并更新相应的环境变量。

示例2:显示当前终端尺寸信息

仅显示尺寸信息而不设置环境变量:

resize -s

输出示例:

COLUMNS=120;
LINES=30;
export COLUMNS LINES;

示例3:使用C shell语法设置环境变量

resize -c

输出示例(C shell语法):

setenv COLUMNS 120;
setenv LINES 30;

示例4:显示详细信息

resize -v

显示终端检测和调整的详细过程信息。

示例5:直接在shell中执行输出

在Bourne shell家族(bash、sh、ksh等)中使用:

eval $(resize)

执行resize命令的输出作为shell命令,立即生效。

示例6:在C shell家族中使用

eval `resize -c`

在C shell或tcsh中使用反引号语法执行。

终端尺寸相关环境变量

环境变量 描述 示例值
COLUMNS 终端窗口的列数(宽度) 80, 120, 160
LINES 终端窗口的行数(高度) 24, 30, 40
TERM 终端类型标识符 xterm, xterm-256color, linux
TERMCAP 终端能力数据库(较旧系统) 由resize自动更新

工作原理

resize命令的工作原理:

  1. 查询终端设备文件(如/dev/tty)获取当前窗口尺寸
  2. 通过终端控制序列CSI 18 t获取实际像素尺寸(如果支持)
  3. 计算字符行数和列数(基于字符尺寸)
  4. 生成相应的环境变量设置命令
  5. 输出设置命令到标准输出或直接执行
  6. 更新TERMCAPTERMINFO数据库中的终端尺寸信息

注意:resize命令本身不改变物理窗口大小,只更新系统对窗口尺寸的认识。

常见终端尺寸标准

尺寸名称 列数×行数 典型用途 历史背景
VT100标准 80×24 传统终端,默认尺寸 DEC VT100终端标准
宽屏终端 120×30 现代宽屏显示器 16:9显示器普及
全屏终端 160×40 编程,日志查看 高分辨率显示器
小尺寸 60×20 移动设备,分屏 平板电脑终端

使用场景

场景1:远程SSH连接

通过SSH连接到远程服务器后,本地终端窗口改变大小时,需要在远程会话中同步更新:

# 连接后调整本地窗口,然后在远程执行
resize
场景2:编程开发

在使用vim、emacs等编辑器时,正确的终端尺寸确保代码正确显示:

# 在.bashrc或.zshrc中添加
alias rs="resize"
场景3:脚本编写

在脚本中确保输出格式正确:

#!/bin/bash
# 确保终端尺寸正确
resize > /dev/null 2>&1
echo "当前终端: ${COLUMNS}列 × ${LINES}行"
场景4:终端模拟器

在图形化终端模拟器(如GNOME Terminal、Konsole)中使用:

# 多数现代终端模拟器自动处理
# 手动调整时可使用
bind '"\C-r": "resize\n"'

注意事项

重要提示:
  1. Shell兼容性:注意-u-c选项对应不同shell家族
  2. 自动检测:现代终端通常自动发送SIGWINCH信号,无需手动resize
  3. 终端支持:某些简单终端可能不支持resize使用的控制序列
  4. 实际效果:resize不改变物理窗口大小,只更新环境变量
  5. 持久性:环境变量只在当前会话有效,新终端需要重新设置
  6. 应用程序缓存:某些应用程序可能缓存终端尺寸,需要重启才能生效
  7. 远程会话:SSH连接中,需要确保两端终端类型兼容
实用技巧
  • 查看当前终端尺寸:echo "列数: $COLUMNS, 行数: $LINES"
  • 手动设置终端尺寸:stty cols 120 rows 30
  • 检查终端类型:echo $TERM
  • 在tmux或screen中使用时,需要调整内部会话尺寸
  • 对于不支持自动调整的终端,在~/.bashrc中添加:trap 'resize' SIGWINCH
  • 测试终端控制序列:echo -e "\033[18t"(返回当前尺寸)
  • 安装resize命令(如果未安装):sudo apt install xterm(Debian/Ubuntu)

相关命令

相关命令 说明
stty 设置终端行数和列数:stty cols 120 rows 30
tput 查询和设置终端能力:tput colstput lines
infocmp 显示终端能力数据库信息
tic 编译终端描述文件
tmux 终端复用器,有自己的尺寸管理:tmux resize-pane -L 10
screen 另一个终端复用器:screen -x

故障排除

常见问题及解决方法:
  1. "resize: command not found":安装xterm包:sudo apt install xterm
  2. 尺寸显示不正确:确保终端类型设置正确:export TERM=xterm-256color
  3. 环境变量未更新:使用eval $(resize)而不是直接执行
  4. 图形化终端无响应:多数图形终端自动处理,检查终端设置中的"自动调整大小"选项
  5. 远程SSH会话问题:确保SSH客户端支持窗口大小变化通知:ssh -o SendEnv=COLUMNS -o SendEnv=LINES host
  6. 脚本中resize无效:脚本执行在子shell中,环境变量不会影响父shell
  7. 非常规终端:对于串口终端等,可能需要手动设置:stty rows 24 cols 80 < /dev/ttyS0

自动化配置

在shell配置文件中自动处理终端尺寸:
# 在 ~/.bashrc 或 ~/.zshrc 中添加

# 如果resize命令存在,则使用它
if type resize >/dev/null 2>&1; then
    # 仅在交互式shell中执行
    if [[ $- == *i* ]]; then
        resize >/dev/null 2>&1
    fi
fi

# 或者使用stty作为备选
set_terminal_size() {
    if [ -t 0 ]; then
        stty rows $(tput lines) cols $(tput cols)
    fi
}

# 窗口大小变化时自动调整
trap 'set_terminal_size' SIGWINCH