“w | tail”在右边距处截断文本(78 个字符)

“w | tail”在右边距处截断文本(78 个字符)

概括: w | tail砍掉第 78 列之后的行。

当我运行“w”命令时,它按预期工作。但是,当我将输出通过管道传输到“tail”时,它将输出截断为78列宽(截断右边距之后的任何内容)。

我检查了setandenv的任何值 78(或 79 或 80),以及TERM(xterm|ansi|vt100) 和stty -a设置,以及tailand 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 喜欢zshbash设置$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

相关内容