In letzter Zeit habe ich mit dem ps
Befehl experimentiert , und manchmal werden lange Pfade zur nächsten Zeile (oder zu zwei) umgebrochen, was das Lesen erschwert. Ich möchte die ps
Ausgabe in ein anderes Programm leiten, um die Ausgabe auf die x
Anzahl der Zeichen zu beschränken.
Folgendes habe ich bisher, aber es funktioniert nicht ganz richtig:
ps aux | cut -c1-$(stty size | cut -d' ' -f2)
$(stty size | cut -d' ' -f2)
ergibt 167, scheint aber keine gültige Eingabe für zu sein cut
.
Gibt es eine Möglichkeit, diese Art von Syntax in Bash zum Laufen zu bringen?
tput rmam; ps aux
zsh
,ksh93
oderbash
speichern Sie die Anschlussbreite in$COLUMNS
Antworten:
Folgendes funktioniert:
Dies funktioniert auch:
Das Problem scheint zu sein, dass
stty
das tty auf seinem Standardeingang sein muss, um zu funktionieren. Die beiden oben genannten Ansätze lösen das.Es gibt noch eine andere Option. Während
stty
sowohl stdin als auch stdout in den obigen Befehlen umgeleitet werden, ist es stderr nicht: Es zeigt immer noch auf ein Terminal. Seltsamerweisestty
funktioniert es auch, wenn es stderr als Eingabe erhält:quelle
tee
wurde hinzugefügt, als ich debuggte . Es ist jetzt weg.<&2
bedeutet, dass Sie Ihre Eingabe vom Standardfehler erhalten.stty
Ruft die Einstellungen des Terminals auf seinem Standard auf (Sie können beispielsweisestty < /dev/other-tty
die Einstellungen eines anderen Terminals abrufen). Es ist also nicht seltsam, dass es nicht funktioniert, wenn sein Standard eine Pipe ist oder das<&2
funktioniert.Einige Shells mögen
zsh
,bash
odermksh
automatisch die eingestellte$COLUMNS
Variable auf die Breite des Anschlusses, so dass Sie nicht aufrufen brauchenstty
hier.Alle Implementierungen von
ps
I, die versucht haben, diese nicht standardmäßige (BSD-Typ) Syntax zu unterstützen, fragen die Terminalbreite selbst ab. Ich bin überrascht, dass deine es nicht tut. Ich gehe jedoch davon aus, dass der Inhalt derCOLUMNS
Umgebungsvariablen berücksichtigt wird.So könnten Sie tun:
Wenn nicht,
Sie können Ihrem Terminal auch mitteilen, dass keine Zeilen umbrochen werden sollen:
quelle
Sie können die
ps
Ausgabe auch etwas besser handhaben .Dadurch wird die
ps
Ausgabe nach Bedarf nach Ihren Vorgaben analysiert.Wenn Sie jedoch keinen Zeilenumbruch verwenden, besteht natürlich das Problem, dass Informationen fehlen. Benötigen Sie wirklich alles für alle Prozesse? Öffnen Sie es in einem Pager, wenn ja:
Wenn nicht, geben Sie an, was Sie sehen möchten:
Alternativ können Sie
ps
Ihr Terminal explizit informieren--width
:Das
--width
Ding funktioniert genau nach Ihren Anforderungen, ohne dass zusätzliche Filter oder Zusatzprozesse erforderlich sind (was Ihre-aux
Ausgabe wahrscheinlich nur noch mehr überladen wird ). Und mit$COLUMNS
wie oben gezeigt und wie Stephane betont, wird es sogar dynamisch funktionieren.Es ist jedoch wahrscheinlich erwähnenswert, dass ich finde, dass Leute oft versuchen, diese Art von unnötigen Filtern hinzuzufügen, damit sie einen
|pipe
durch einen anderen Filter aufnehmen können, um die Ausgabe zu analysieren, was wahrscheinlich auch unnötig ist. Natürlich meine ich mit Leuten meistens mich.Mit dem
-o
oben erwähnten Utput-Operanden können Sie filtern, welche Spaltenps
angezeigt werden, und wenn Sie die=
Zuordnung hinzufügen, können Sie die Spalte sogar nach Belieben benennen. Ich lasse die Zuweisung leer und übergebe ihr einen-p
Zielprozess,$pid
sodass die einzige Ausgabeps
überhaupt der$pid
Befehlsname und dessenargs
Aufruf ist. Und-o
kratzt kaum an der Oberfläche, wie Sie definieren können, wasps
angezeigt wird oder nicht. Dies ist die Richtung, die ich Ihnen empfehlen würde, insbesondere über:quelle