¿Es "ps -u" realmente una sintaxis incorrecta?

75

En mi humilde opinión ps -umuestra una salida muy útil, mucho mejor que ps -u $USER:

$ ps -u
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
elastic   234897  0.0  0.0 105980  1336 pts/2    S+   Oct10   0:00 /bin/bash ./run.sh collector-json-1.conf
elastic   234899 48.7  7.1 10087120 4433104 pts/2 Sl+ Oct10 2804:11 /usr/java/jdk1.7.0_09_x64/bin/java -Xmx6144m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Djava.awt.headless=true -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatin
:

comparado con

$ ps -u $USER
    PID TTY          TIME CMD
 234897 pts/2    00:00:00 run.sh
 234899 pts/2    1-22:44:04 java
:
  1. Pero, ¿por qué es "mala sintaxis"? /usr/share/doc/procps-3.2.8/FAQno ayuda mucho
  2. ¿Cuál sería una "sintaxis adecuada" para lograr exactamente la misma salida?

En caso de que sea importante:

$ uname -a
Linux h22k34.local 2.6.32-042stab044.17 #1 SMP Fri Jan 13 12:53:58 MSK 2012 x86_64 x86_64 x86_64 GNU/Linux
sjngm
fuente
55
Y ahora para la parte difícil: ¿Qué respuesta debería obtener la marca de verificación?
sjngm
En realidad, pensé que debería permitirles a ustedes, los usuarios, decidir. El que tenga los votos más altos debería obtenerlo. Pero, no estás haciendo esto más fácil;)
sjngm
66
cuando ambas respuestas son igual de buenas, las voto a ambas, y le doy la marca de verificación al usuario con el representante más bajo, especialmente cuando la diferencia es más de 100k.
Frank Thomas
1
@FrankThomas done :)
sjngm
En los sistemas basados ​​en SysV (o en aquellos que psprovienen de esa línea de cosas), con frecuencia uso ps -fu $USER... obtener ps -fel formato de salida que es algo similar al ps uformato, pero también obtengo lo de especificar un usuario. En caso de que quisieras ambos al mismo tiempo.
lindes-hw

Respuestas:

130

La sintaxis correcta, que devuelve la misma salida , sería:

ps u

Hay una buena razón por la cual la sintaxis moderna pses un desastre. Históricamente, había dos versiones incompatibles de ps. Las opciones con un guión principal se heredaron de la versión AT&T Unix de ps. Las opciones sin un guión inicial se heredaron de BSD. La versión de pslas distribuciones de Linux que generalmente se usa es GNU, que ha combinado ambos conjuntos de opciones, además de haber agregado su propio conjunto de opciones que comienzan con un doble guión inicial.

Por lo tanto, ps ues de estilo BSD y ps -u $USERes de estilo AT&T. El hecho de que GNU le pspermite ejecutar ps -uy, además de la advertencia, obtener el mismo resultado que ps umuestra que GNU está tratando de sacar lo mejor de una mala situación.

John1024
fuente
En realidad, no hay una buena razón para el desorden. Hay varios malos, y la supuesta dicotomía de "GNU" y "BSD" es una falacia propuesta por una página de manual de Linux. Ver unix.stackexchange.com/a/511530/5132 .
JdeBP
84

El pscomando históricamente tenía una sintaxis muy diferente en BSD y System V Unix.

  • En BSDps , la uopción (sin guión) no toma ningún parámetro y muestra la "salida orientada al usuario" con las columnas adicionales.

  • En SunOSps , la -uopción (con guión) toma un nombre de usuario como parámetro y solo incluye procesos propiedad de ese usuario, pero sin cambiar el formato de visualización.

(Como otro ejemplo muy común, BSD esignifica "mostrar entorno", mientras que SunOS -esignifica "mostrar los procesos de todos").

Procps de Linuxps intenta admitir ambos estilos. Entonces, si usa la opción 'guión' -u, esperará que sea la opción "filtrar a este usuario" de SunOS, no la opción de columnas extendidas. Sin embargo, los dos se confunden con bastante frecuencia, por lo que procps intenta hacer lo que usted quiso: si falta el nombre de usuario, supondrá que le dio una opción BSD pero usó la sintaxis de SunOS.

(De hecho, había tantas variantes diferentes psque el procps tiene una tabla real de "personalidades" para forzar que el comportamiento ambiguo se interprete como un estilo u otro u otro - además de botones como "UNIX95", "CMD_ENV", "_XPG", "I_WANT_A_BROKEN_PS" ...)

Gravedad
fuente
29
"I_WANT_A_BROKEN_PS" hah.
42
... Al principio, pensé que era una broma. Pero nooooo ...
Izkata
99
Hmm, como resultado, esta es exactamente la opción para ocultar el "uso ambiguo" de las advertencias que está viendo OP.
Grawity