概括: w | tail
砍掉第 78 列之后的行。
当我运行“w”命令时,它按预期工作。但是,当我将输出通过管道传输到“tail”时,它将输出截断为78列宽(截断右边距之后的任何内容)。
我检查了set
andenv
的任何值 78(或 79 或 80),以及TERM
(xterm|ansi|vt100) 和stty -a
设置,以及tail
and w
(它们看起来不错)。 $COLUMNS
设置为209(但这并不重要...我将其设置为100,结果相同)。
我正在运行 CentOS 5(内核 - 2.6.18)。tail
和二进制w
文件对我来说看起来不错。
/usr/bin/w:ELF 64 位 LSB 可执行文件,AMD x86-64,版本 1 (SYSV),适用于 GNU/Linux 2.6.9,动态链接(使用共享库),已剥离
CentOS$ cat 80.txt
1 2 3 4 5 6 7 8
012345678901234567890123456789012345678901234567890123456789012345678901234567890
----------+---------+---------+---------+---------+---------+---------+---------+
CentOS$ export COLUMNS=100
CentOS$ w | tail -5 | sed 's/./\./g'
.....................................................................
...............................................................................
...............................................................................
...............................................................................
...............................................................................
答案1
Whenw
的输出进入终端。w
查询终端驱动程序的列数并相应地调整宽度。
当输出不发送到终端(例如发送到管道时)时,它会恢复为 80 列的固定宽度。版本procps
从3.3.2开始允许使用$COLUMNS
环境变量覆盖默认值。
有些 shell 喜欢zsh
或bash
设置$COLUMNS
变量,但不导出它。在他们身上,你可以做
COLUMNS=$COLUMNS w | tail
如果无论终端有多宽,您都不希望行被截断,您可以执行以下操作:
COLUMNS=512 w | tail
如果您有较旧的终端w
,您可能别无选择,只能模拟宽终端。和zsh
:
zmodload zsh/zpty
zpty W 'stty cols 512 -opost && w'
{zpty -r W} | tail
zpty -d W
其他可以模拟终端的东西:
ssh localhost -t 'stty cols 512 -opost && w' | tail
expect -c 'set stty_init {cols 512 -opost}; spawn -noecho w; expect eof' | tail