如何获取终端的行数? (与“echo $COLUMNS”相比)

如何获取终端的行数? (与“echo $COLUMNS”相比)

我终于打开了ssh手机,但这样做后,我意识到我的一些古老的硬编码脚本非常特定于 80x24 分辨率。

我知道这$COLUMNS会给我 80 分,并允许我做一些事情,但我想弄清楚在哪里可以访问我正在查看的终端的另一个维度。

我不想为我可能使用的每个终端、电话或其他硬件硬编码一套,但现在看起来这可能是最好的选择。

我的手机通过 ConnectBot 为我提供了 53x13(找不到更好的解决方案?),以防有人关心。

答案1

$COLUMNSfor rows的等价物是$LINES.这是由一些 shell 进行设置的,例如zshbash(尽管在 的情况下bash,仅在交互时)基于 tty 设备线路规则设置(它们本身,通常由终端仿真器设置,或者在 的情况下sshsshd由客户端提供的值设置(我不知道是否ConnectBot发送那些))。

您应该能够在 shell 手册页中找到该信息。例如,对于zsh: info zsh LINES

其他选项:

  • 在某些系统上(和这将成为未来 POSIX 版本的标准),返回与一行stty size相同的信息。在其他情况下,它们通常会以不同系统不同的格式<lines> <columns>显示在though的输出中。stty -a
  • 通过ncurses的实现tput,您可以使用tput linestput cols来获取行数和列数(当无法从终端设备检索信息时,可以回退到查询 terminfo 数据库)。
  • 一些xterm类似的终端模拟器(我不知道 ConnectBot 是否属于这种情况)允许您通过一些转义序列(\e[18t)查询终端大小。例如,与zsh

    IFS=";" read -sd t $'ignore?\e[18t' lines cols
    

    将尺寸存储在$lines和中$cols

  • 对于大多数终端,还可以使用(更常见的)转义序列来代替\e[18t转义序列,将光标移动到屏幕的右下角并查询那里的光标位置。这就是resize实用程序附带的xterm实际功能,可用于将 tty 设置与该设置对齐,并为那些尚未自行执行此操作的 shell 设置环境变量$LINES$COLUMNS

    eval "$(resize -u)"
    

答案2

stty size输出当前终端的行数和列数;要提取行数,请仅保留第一个字段:

stty size | cut -d\  -f1

相关内容