“W | Schwanz “schneidet Text am rechten Rand (78 Zeichen)

7

Zusammenfassung: w | tail Zerhackt Zeilen nach der 78. Spalte.

Wenn ich den Befehl "w" ausführe, funktioniert er wie erwartet. Wenn ich die Ausgabe jedoch an "tail" weiterleite, wird die Ausgabe auf 78 Spalten Breite reduziert (alles wird nach dem rechten Rand abgeschnitten).

Ich habe überprüft setund envfür beliebige Werte von 78 (oder 79 oder 80), sowie TERM(xterm | ansi | VT100) und stty -aEinstellungen sowie tailund w(sie sehen OK). $COLUMNSist auf 209 eingestellt (aber das spielt keine Rolle ... Ich habe es auf 100 mit den gleichen Ergebnissen eingestellt).

Ich verwende CentOS 5 (Kernel - 2.6.18). Die tailund wBinärdateien sehen für mich OK aus.

/ usr / bin / w: ELF 64-Bit-LSB-ausführbare Datei, AMD x86-64, Version 1 (SYSV), für GNU / Linux 2.6.9, dynamisch verknüpft (verwendet gemeinsam genutzte Bibliotheken), entfernt

CentOS$ cat 80.txt
          1         2         3         4         5         6         7         8
012345678901234567890123456789012345678901234567890123456789012345678901234567890
----------+---------+---------+---------+---------+---------+---------+---------+
CentOS$ export COLUMNS=100
CentOS$ w | tail -5 | sed 's/./\./g'
.....................................................................
...............................................................................
...............................................................................
...............................................................................
...............................................................................
Razzlephrazz
quelle
Versuchen Sie es alias w='w | more. Das hat mir sehr geholfen.
ott--

Antworten:

8

Wenn wder Ausgang an ein Terminal geht. wfragt den Terminaltreiber nach der Anzahl der Spalten ab und passt die Breite entsprechend an.

Wenn die Ausgabe nicht an ein Terminal geht, z. B. an eine Pipe, wird auf eine feste Breite von 80 Spalten zurückgesetzt. Versionen procps seit 3.3.2 ermöglichen es, diesen Standard mit der $COLUMNSUmgebungsvariablen zu überschreiben .

Einige Shells mögen zshoder bashsetzen die $COLUMNSVariable, exportieren sie aber nicht. In ihnen können Sie tun

COLUMNS=$COLUMNS w | tail

Wenn Sie nicht möchten, dass die Leitungen abgeschnitten werden, unabhängig davon, wie breit das Terminal ist, können Sie Folgendes tun:

COLUMNS=512 w | tail

Wenn Sie älter sind w, haben Sie wahrscheinlich keine andere Wahl, als ein breites Terminal zu emulieren. Mit zsh:

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

Andere Dinge, die ein Terminal emulieren können:

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

expect -c 'set stty_init {cols 512 -opost}; spawn -noecho w; expect eof' | tail
Stéphane Chazelas
quelle
Ich verwende bash 4.2.0 (1), w version procps 3.2.7 in einem CentOS 5.3. Die COLUMNS var macht keinen Unterschied
RSFalcon7
Sollte ich diese Einstellung nicht verwenden, wenn ich die Variable COLUMNS exportiere? [versuchte dies]
Razzlephrazz
COLUMNS=0funktioniert bei mir nicht Tut es COLUMNS=1000jedoch.
Peterph
@Razzlephrazz, ja, obwohl das auch andere Befehle betreffen würde. Ihr Problem ist wahrscheinlich, dass Sie eine zu alte Version von w haben, um das Überschreiben der Breite zu unterstützen.
Stéphane Chazelas
Danke, Stephane. Wissen Sie, wie ich herausfinden kann, wie alt mein "w" ist und wann die Version erstellt wurde, in der es repariert wurde? Dies ist anscheinend ein Fehler im Befehl "w". Oder vielleicht verwendet meine Version des Befehls w anstelle von COLUMNS eine andere ENV-Variable.
Razzlephrazz