具有当前终端宽度的环境(?)变量的名称是什么?

use*_*082 5 shell shell-script

我知道这很简单,但我不记得它的位置/名称。

存储终端当前宽度的变量在哪里?

我看到这个答案谈到了改变: 终端长度和宽度如何通过 SSH 和 telnet 转发?

但我想获得当前值,以用于脚本(并且我不了解该答案中的所有内容)。

曾几何时,我记得有某种方法可以显示所有环境变量?(嗯,我看到一个回答说 use set(vs. env),但我set只显示 LINES 而不是宽度?)


然后当然是下一个问题;一旦我有了那个 $number 我想多次重复一个字符( "-" ),以制作一条 X 字符宽的虚线(填充终端,不换行)。如果你有一种优雅的方式,我应该这样做,我也会很感激。

ikr*_*bbe 7

STTY 尺寸

规范的方法是询问终端它的实际大小,当你想知道它时

stty size
Run Code Online (Sandbox Code Playgroud)

打印行列。

打印一条虚线

关于你的第二个问题,seq你的朋友

stty size|if read rows cols
then for x in `seq $cols`
do printf "-"
done fi
Run Code Online (Sandbox Code Playgroud)

或每个awk循环

stty size|awk '{ ORS="-"; n=$2; for (i=0; i<n; ++i) { print ""; } }'
Run Code Online (Sandbox Code Playgroud)

.

设置行变量

但实际上最好将我们的行保存在变量中

eval $(L=""; stty size|if read r c
    then for x in `seq $c`
    do L="${L}-"
    done
    echo L="$L"
    fi
)
Run Code Online (Sandbox Code Playgroud)

SIGWINCH 上的陷阱

只要我们不需要重新计算终端大小

trap 'echo "recalculate L"' SIGWINCH
Run Code Online (Sandbox Code Playgroud)

我们现在可以使用$L来打印该行。当然,您可以自动调整您的$L变量SIGWINCH

trap 'eval $(L=""; stty size|if read r c
    then for x in `seq $c`
    do L="${L}-"
    done
    echo L="$L"
    fi
)' SIGWINCH
Run Code Online (Sandbox Code Playgroud)

. 在您设置的终端中,trap您可以这样说

echo $L
Run Code Online (Sandbox Code Playgroud)

你就完成了。


小智 1

我相信您可能正在寻找$COLUMNS变量。

至于使字符跨越终端的整个宽度,这是一个基于 值的简单循环$COLUMNS。如果屏幕的大小与历史记录中的那些行一起调整,它们看起来会很不愉快。

  • 这实际上并不是一个环境变量,而是[某些] shell 的虚拟发明。证据是,如果它是一个环境变量,那么当你的 tty 调整大小时它不会改变。 (2认同)