我知道这很简单,但我不记得它的位置/名称。
终端当前宽度的变量存储在哪里?
我看到这个答案谈到了改变事情: 终端长度和宽度如何通过 SSH 和 telnet 转发?
但我想获取当前值,以便在脚本中使用(并且我不理解该答案中的所有内容)。
曾几何时我记得有某种方法可以显示所有环境变量? (嗯,我看到一个答案说使用set
(与env
),但我的set
只显示线条而不显示宽度?)
然后当然是下一个问题;一旦我有了那个 $number ,我想多次重复一个字符(“-”),以制作一条 X 字符宽的虚线(填充终端,不换行)。如果你有一个优雅的方式我应该这样做,我也会很感激。
答案1
尺寸
规范的方法是当你想知道它的实际大小时询问终端
stty size
打印行列。
打印虚线
关于你的第二个问题,seq
你是朋友吗?
stty size|if read rows cols
then for x in `seq $cols`
do printf "-"
done fi
或每个awk
循环
stty size|awk '{ ORS="-"; n=$2; for (i=0; i<n; ++i) { print ""; } }'
。
设置行变量
但实际上最好将我们的行保存在变量中
eval $(L=""; stty size|if read r c
then for x in `seq $c`
do L="${L}-"
done
echo L="$L"
fi
)
SIGWINCH 上的陷阱
只要我们不需要重新计算终端尺寸
trap 'echo "recalculate L"' SIGWINCH
我们现在可以用来$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
。在您设置的终端中,trap
您可以这样说
echo $L
你就完成了。
答案2
没有环境包含终端宽度的变量。有一个壳变量:(高度COLUMNS
也同样)。LINES
这只是一个 shell 变量,对于 shell 调用的程序不可见。
原因COLUMNS
只是一个shell变量并没有导出到环境中,因为一旦该变量在环境中,shell就无法修改它。如果您调整终端的大小,shell(或更一般地说,前台的任何程序)都会收到一个SIGWINCH信号。当 shell 收到 SIGWINCH 时,它会查询终端的当前大小并相应地更新COLUMNS
和LINES
变量。
该命令set
列出所有 shell 变量,因此包括COLUMNS
和LINES
。命令env
和export
仅列出环境变量,因此不包括COLUMNS
和LINES
。
您可以导出COLUMNS
以使其成为环境变量。但请注意,当应用程序使用它时,如果终端已同时调整大小,则该信息可能已过时。应用程序可以以与终端相同的方式查询终端大小,并为 SIGWINCH 信号注册一个处理程序,以便它可以保持信息最新。
1通过发送正确的读写控制命令。或者甚至通过致电stty size
或tput cols
。
答案3
它位于set
“列”下。
echo $COLUMNS
或者
set | grep -i columns
在bash中。
答案4
我相信您可能正在寻找$COLUMNS
变量。
至于使字符跨越终端的整个宽度,这是一个基于 值的简单循环$COLUMNS
。如果屏幕的大小与历史记录中的那些行一起调整,它们看起来会很不愉快。