在 中man bash
,我看到环境变量COLUMNS
是终端宽度。我使用了它的不同值,但就字符数而言,它似乎不是实际的终端宽度:
$ dpkg -l | grep mozilla
ii rhythmbox-mozilla 2.96-0ubuntu4.3 Rhythmbox Mozilla plugin
ii totem-mozilla 3.0.1-0ubuntu21.1 Totem Mozilla plugin
$ echo $COLUMNS
135
$ COLUMNS=13 dpkg -l | grep mozilla
ii totem-mozilla 3.0.1-0ubuntu2 Totem Mozilla plugin
$ COLUMNS=1 dpkg -l | grep mozilla
ii totem-mozilla 3.0.1-0ubuntu2 Totem Mozilla plugin
$ COLUMNS=100 dpkg -l | grep mozilla
ii rhythmbox-mozilla 2.96-0ubuntu4.3 Rhythmbox Mozilla plugin
ii totem-mozilla 3.0.1-0ubuntu21.1 Totem Mozilla plugin
$ COLUMNS=200 dpkg -l | grep mozilla
ii rhythmbox-mozilla 2.96-0ubuntu4.3 Rhythmbox Mozilla plugin
ii totem-mozilla 3.0.1-0ubuntu21.1 Totem Mozilla plugin
列的终端宽度是多少?谢谢。
答案1
COLUMNS
是 bash 设置的变量,并不意味着您手动设置的变量。默认情况下它也不导出,因此 shell 启动的应用程序甚至看不到它。
那是为了什么?它包含终端模拟器的字符宽度。它的垂直等效值为LINES
.它们都由select
shell 内置使用。该select
内置项用于向用户呈现他们可以选择的项目列表。然后它尝试显示该列表,使其适合终端。示例如下:
使用 35x50 终端窗口:
$ select foo in a b c d e f g h i j k l m n o p q r s t u v w x y z; do echo foo="$foo"; done
1) a 7) g 13) m 19) s 25) y
2) b 8) h 14) n 20) t 26) z
3) c 9) i 15) o 21) u
4) d 10) j 16) p 22) v
5) e 11) k 17) q 23) w
6) f 12) l 18) r 24) x
#?
使用 100x10 终端窗口:
$ select foo in a b c d e f g h i j k l m n o p q r s t u v w x y z; do echo foo="$foo"; done
1) a 3) c 5) e 7) g 9) i 11) k 13) m 15) o 17) q 19) s 21) u 23) w 25) y
2) b 4) d 6) f 8) h 10) j 12) l 14) n 16) p 18) r 20) t 22) v 24) x 26) z
#?
答案2
$COLUMNS
给出终端宽度。关于使用 with dpkg -l
,您应该查看最长的行(即不要使用,grep
因为它可能会丢弃该行)。当然,如果$COLUMNS
太小,比如1或13,就无能为力了。
编辑:如果dpkg -l
输出未连接到终端,例如当管道到 grep 时,dpkg 使用基于最长字段的列大小;因此输出可能比终端更宽。如果您想考虑终端宽度,请使用:
COLUMNS=$COLUMNS dpkg -l | grep ...
请注意,shell 变量$COLUMNS
默认情况下不导出(即不是环境变量),并且具有作为 dpkg 的环境变量COLUMNS=$COLUMNS
提供的效果。COLUMNS