Últimamente, he estado experimentando con el ps
comando y, a veces, los caminos largos se envuelven a la siguiente línea (o dos) y dificultan la lectura. Quiero canalizar la ps
salida a otro programa para limitar la salida al x
número de caracteres.
Esto es lo que tengo hasta ahora, pero no funciona del todo bien:
ps aux | cut -c1-$(stty size | cut -d' ' -f2)
$(stty size | cut -d' ' -f2)
evalúa a 167, pero no parece ser una entrada válida para cut
.
¿Hay alguna manera de hacer que este tipo de sintaxis funcione en bash?
tput rmam; ps aux
zsh
,ksh93
obash
almacenan el ancho de la terminal en$COLUMNS
Respuestas:
Los siguientes trabajos:
Esto también funciona:
El problema parece ser que
stty
necesita tener el tty en su entrada estándar para funcionar. Los dos enfoques anteriores resuelven eso.Todavía hay otra opción. Mientras que
stty
stdin y stdout se redirigen en los comandos anteriores, su stderr no lo es: todavía apunta a una terminal. Curiosamente,stty
también funcionará si se le da stderr como entrada:fuente
tee
se agregó cuando estaba depurando. Se ha ido ahora.<&2
significa obtener su entrada del error estándar.stty
obtiene la configuración del terminal abierta en su stdin (stty < /dev/other-tty
por ejemplo , para obtener la configuración de otro terminal). Por lo tanto, no es extraño que no funcione si su stdin es una tubería o eso<&2
funciona.A algunos shells les gusta
zsh
,bash
omksh
configuran automáticamente la$COLUMNS
variable al ancho del terminal, por lo que no necesita invocarstty
aquí.Todas las implementaciones de
ps
Traté de soportar esa sintaxis no estándar (tipo BSD) consultan el ancho del terminal por sí mismas. Me sorprende que el tuyo no. Sin embargo, espero que vea el contenido de la variable deCOLUMNS
entorno .Entonces podrías hacer:
Si no,
También puede decirle a su terminal que no ajuste las líneas:
fuente
También puede manejar la
ps
salida un poco mejor.Eso le indicará
ps
que analice su salida según sus especificaciones según sea necesario.Por supuesto, si no ajusta la palabra, entonces tiene el problema de la falta de información. ¿Realmente lo necesitas todo para todos los procesos? Ábralo en un buscapersonas si es así:
Si no, especifique lo que desea ver:
Alternativamente, puede informar explícitamente
ps
de su terminal--width
:La
--width
cosa funciona exactamente según sus especificaciones solicitadas sin tener que involucrar filtros adicionales o procesos auxiliares (lo que probablemente solo saturará su-aux
salida aún más). Y con lo$COLUMNS
que se muestra arriba y como señala Stephane, incluso funcionará dinámicamente.Sin embargo, probablemente valga la pena señalar que encuentro que las personas a menudo intentan agregar este tipo de filtros innecesarios para que puedan acomodar uno a
|pipe
través de otro filtro para analizar la salida, que también es bastante probable que sea innecesario. Por supuesto, por personas me refiero principalmente a mí.El
-o
operando utput que menciono anteriormente le permite filtrar qué columnas seps
muestran, y cuando agrega la=
asignación, incluso puede nombrar la columna como desee. Dejo la asignación vacía y le doy un-p
proceso de destino$pid
para que la única salida deps
todos sea el$pid
nombre del comando y suargs
invocación. Y-o
apenas rasca la superficie de cómo puedes definir lo que seps
mostrará o no. Esta es la dirección que le recomendaría que tome, especialmente a través de:fuente