Dernièrement, j'ai expérimenté avec la ps
commande, et parfois de longs chemins passent à la ligne suivante (ou deux) et la rendent difficile à lire. Je veux diriger la ps
sortie vers un autre programme pour limiter la sortie au x
nombre de caractères.
Voici ce que j'ai jusqu'à présent, mais cela ne fonctionne pas très bien:
ps aux | cut -c1-$(stty size | cut -d' ' -f2)
$(stty size | cut -d' ' -f2)
évalue à 167, mais ne semble pas être une entrée valide pour cut
.
Existe-t-il un moyen de faire fonctionner ce type de syntaxe en bash?
tput rmam; ps aux
zsh
,ksh93
oubash
stockent la largeur du terminal dans$COLUMNS
Réponses:
Les oeuvres suivantes:
Cela fonctionne également:
Le problème semble être qu'il
stty
doit avoir le tty sur son entrée standard pour fonctionner. Les deux approches ci-dessus résolvent cela.Il y a encore une autre option. Alors que
stty
stdin et stdout sont tous deux redirigés dans les commandes ci-dessus, son stderr ne l'est pas: il pointe toujours vers un terminal. Curieusement,stty
cela fonctionnera également si on lui donne stderr comme entrée:la source
tee
été ajouté lors du débogage. C'est parti maintenant.<&2
signifie obtenir votre entrée d'erreur standard.stty
obtient les paramètres du terminal ouverts sur son stdin (vous faitesstty < /dev/other-tty
pour obtenir les paramètres d'un autre terminal par exemple). Il n'est donc pas étrange que cela ne fonctionne pas si son stdin est un tuyau ou que cela<&2
fonctionne.Quelques coquilles aiment
zsh
,bash
oumksh
règlent automatiquement la$COLUMNS
variable à la largeur du terminal, de sorte que vous n'avez pas besoin d'invoquerstty
ici.Toutes les implémentations de
ps
J'ai essayé de prendre en charge cette syntaxe non standard (type BSD) interrogent la largeur du terminal par elles-mêmes. Je suis surpris que le vôtre ne le fasse pas. Je m'attends cependant à ce qu'il examine le contenu de la variable d'COLUMNS
environnement .Vous pourriez donc faire:
Si non,
Vous pouvez également dire à votre terminal de ne pas boucler les lignes:
la source
Vous pouvez également gérer
ps
un peu mieux la sortie.Cela indiquera
ps
d'analyser sa sortie selon vos spécifications si nécessaire.Bien sûr, si vous ne faites pas de retour à la ligne, vous avez le problème de manquer d'informations. Avez-vous vraiment besoin de tout cela pour tous les processus? Ouvrez-le dans un pager si c'est le cas:
Sinon, spécifiez ce que vous voulez voir:
Alternativement, vous pouvez explicitement informer
ps
de votre terminal--width
:La
--width
chose fonctionne exactement selon les spécifications demandées sans avoir à impliquer de filtres supplémentaires ou de processus auxiliaires (ce qui ne fera qu'encombrer-aux
encore plus votre sortie). Et$COLUMNS
comme indiqué ci-dessus et comme le souligne Stéphane, cela fonctionnera même de manière dynamique.Il est probablement intéressant de noter, cependant, que je trouve des gens essaient souvent d'ajouter ces types de filtres inutiles afin qu'ils puissent accueillir un
|pipe
par un autre filtre à la sortie parse qui est aussi très susceptible d'être inutile. Bien sûr, par les gens, je veux surtout dire moi.L'
-o
opérande utput que je mentionne ci-dessus vous permet de filtrer les colonnes àps
afficher, et lorsque vous ajoutez l'=
assignation, vous pouvez même nommer la colonne à votre guise. Je laisse l'affectation vide et lui-p
remets un processus cible$pid
afin que la seule sortie dups
tout soit le$pid
nom de la commande et sonargs
à l'invocation. Et-o
gratte à peine la surface de la façon dont vous pouvez définir ceps
qui sera affiché ou non. C'est la direction que je vous recommanderais de prendre, notamment via:la source