“w | tail ”corta o texto na margem direita (78 caracteres)

7

Resumo: w | tail interrompe as linhas após a 78ª coluna.

Quando eu executo o comando "w", ele funciona como esperado. No entanto, quando canalizo a saída para "tail", ela corta a saída para 78 colunas de largura (trunca qualquer coisa após a margem direita).

Eu verifiquei set e env para quaisquer valores de 78 (ou 79 ou 80), bem como TERM (xterm | ansi | vt100) e stty -a configurações, bem como tail e w (eles parecem OK). $COLUMNS está configurado para 209 (mas isso não importa ... eu configurei para 100 com os mesmos resultados).

Estou rodando o CentOS 5 (kernel - 2.6.18). Os binários tail e w parecem corretos para mim.

/usr/bin/w: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped

CentOS$ cat 80.txt
          1         2         3         4         5         6         7         8
012345678901234567890123456789012345678901234567890123456789012345678901234567890
----------+---------+---------+---------+---------+---------+---------+---------+
CentOS$ export COLUMNS=100
CentOS$ w | tail -5 | sed 's/./\./g'
.....................................................................
...............................................................................
...............................................................................
...............................................................................
...............................................................................
    
por Razzlephrazz 13.05.2013 / 16:13

1 resposta

8

Quando a saída de w vai para um terminal. w consulta o driver do terminal quanto ao número de colunas e ajusta a largura de acordo.

Quando a saída não vai para um terminal, como quando vai para um cano, ele retorna a uma largura fixa de 80 colunas. As versões de procps desde a versão 3.3.2 permitem substituir esse padrão com a variável de ambiente $COLUMNS .

Algumas camadas, como zsh ou bash , definem a variável $COLUMNS , mas não as exportam. Neles, você pode fazer

COLUMNS=$COLUMNS w | tail

Se você não quiser que as linhas sejam truncadas, independentemente do tamanho do terminal, faça o seguinte:

COLUMNS=512 w | tail

Se você tiver um w mais antigo, provavelmente não terá outra opção a não ser emular um terminal amplo. Com zsh :

zmodload zsh/zpty
zpty W 'stty cols 512 -opost && w'
{zpty -r W} | tail
zpty -d W

Outras coisas que podem emular um terminal:

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

expect -c 'set stty_init {cols 512 -opost}; spawn -noecho w; expect eof' | tail
    
por 13.05.2013 / 16:32