"w | tail" 在右边距切割文本(78 个字符)

Raz*_*azz 7 terminal pipe shell-script tty

摘要: w | tail在第 78 列之后砍行。

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

我检查set,并env为78(或79或80)的任何值,以及TERM(xterm中| ANSI | VT100),和stty -a设置,以及tailw(他们看起来OK)。 $COLUMNS设置为 209(但这无关紧要...我将其设置为 100,结果相同)。

我正在运行 CentOS 5(内核 - 2.6.18)。在tailw二进制文件看行给我。

/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'
.....................................................................
...............................................................................
...............................................................................
...............................................................................
...............................................................................
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 8

Whenw的输出到达终端。w向终端驱动程序查询列数并相应地调整宽度。

当输出未到达终端(例如到达管道时)时,它会恢复为 80 列的固定宽度。procps 自 3.3.2 以来的版本允许使用$COLUMNS环境变量覆盖该默认值。

一些 shell 喜欢zshbash设置$COLUMNS变量,但不导出它。在他们中,你可以做

COLUMNS=$COLUMNS w | tail
Run Code Online (Sandbox Code Playgroud)

如果无论终端有多宽,您都不希望行被截断,您可以执行以下操作:

COLUMNS=512 w | tail
Run Code Online (Sandbox Code Playgroud)

如果您有一个较旧的w,您可能别无选择,只能模拟一个宽终端。与zsh

zmodload zsh/zpty
zpty W 'stty cols 512 -opost && w'
{zpty -r W} | tail
zpty -d W
Run Code Online (Sandbox Code Playgroud)

其他可以模拟终端的东西:

ssh localhost -t 'stty cols 512 -opost && w' | tail

expect -c 'set stty_init {cols 512 -opost}; spawn -noecho w; expect eof' | tail
Run Code Online (Sandbox Code Playgroud)