使用 bash 脚本获取控制台宽度

使用 bash 脚本获取控制台宽度

我遇到一个问题,我试图使用脚本获取终端的大小。通常我会在控制台内使用该命令tput cols,但是我希望能够通过严格使用脚本来完成此功能。

截至目前,我能够检测正在运行的控制台并获取其文件路径。然而,我正在努力使用这些信息来获取控制台的宽度。我尝试过使用该命令tput,但我对 Linux/脚本相当陌生,因此不知道该怎么做。

这样做的原因是我希望能够设置一个计划任务经常通知控制台其宽度/列的条目。

到目前为止,这是我的代码:

tty.sh

#!/bin/bash

#Get PID of terminal
#terminal.txt holds most recent PID of console in use
value=$(</home/test/Documents/terminal.txt)

#Get tty using the PID from terminal.txt
TERMINAL="$(ps h -p $value -o tty)"
echo $TERMINAL

#Use tty to get full filepath for terminal in use
TERMINALPATH=/dev/$TERMINAL
echo $TERMINALPATH

COLUMNS=$(/home/test/Documents/get_columns.sh)
echo $COLUMNS

获取列.sh

#!/usr/bin/env bash
echo $(/usr/bin/tput cols)

TERMINAL&的正常输出TERMINALPATH是和,例如&pts/terminalnumber/dev/pts/terminalnumberpts/0/dev/pts/0

答案1

tput命令是一个出色的工具,但不幸的是它无法检索任意选择的终端的实际设置。

这样做的原因是它读到标准输出对于终端特性,这也是它写下答案的地方。因此,当您尝试捕获输出的那一刻,tput cols您也已经删除了其信息的来源。

幸运的是,stty读到标准输入而不是标准输出用于确定终端特性,因此您可以通过以下方式检索所需的尺寸信息:

terminal=/dev/pts/1
columns=$(stty -a <"$terminal" | grep -Po '(?<=columns )\d+')
rows=$(stty -a <"$terminal" | grep -Po '(?<=rows )\d+')

顺便说一下,将其写为 是不必要的麻烦echo $(/usr/bin/tput cols)

echo $(some_command)对于您正在运行并捕获其输出的任何构造some_command,然后将其传递给echo输出。在几乎所有情况下,您都可以想象您还不如直接运行some_command并让它直接提供输出。它更高效,也更容易阅读。

答案2

tput colstput lines从终端设备的 stdout 上查询终端的大小(从终端设备驱动程序,而不是终端本身),如果 stdout 不是终端设备(就像cols=$(tput cols)它是管道的情况一样),则从 stderr 查询。

因此,要从任意终端设备检索值,您需要在 stderr 上打开该设备tput

{ cols=$(tput cols) rows=$(tput lines); } 2< "$TERMINALPATH"

(此处以只读模式打开,因此tput不会在那里输出错误消息)。

或者,您也许可以使用stty size.stty在 stdin 上查询终端:

read rows cols < <(stty size < "$TERMINALPATH")

这些都不是标准的,因此可能(并且实际上不会)不适用于所有系统。不过它应该可以很好地移植到 GNU/Linux 系统。

stty size向 POSIX 请求添加或其他方法来查询终端大小但讨论似乎没有任何进展。

答案3

这个脚本:

#!/bin/bash

echo "The number of columns are $COLUMNS"
echo "The number of lines are $LINES"

在这里工作,绝对没有更多......

为什么要使用数据设置环境变量?

COLUMNS=$(/home/test/Documents/get_columns.sh)

您是否尝试从其他脚本或 tty 获取列和行?是这样吗?对我来说仍然很奇怪,因为您正在为本地脚本设置 columns 环境变量......

答案4

我的答案与罗艾玛的不同,因为它是动态的。他/她的答案为您提供了创建时终端的大小。例如,如果您使用平铺窗口管理器(如 i3 或 bspwm),您宁愿拥有终端的当前宽度。因此,我使用 coreutils 包中的 ssty:

#!/bin/bash
stty size | awk '{print $2}'

Luciano 的解决方案在 xterm 和 xfce4-terminal 中完美运行。我不知道是否所有终端都设置了 $COLUMNS 变量。

相关内容