Является ли «ps -u» действительно плохим синтаксисом?

75

ИМХО ps -uпоказывает очень полезный вывод, намного лучше чем 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
:

по сравнению с

$ ps -u $USER
    PID TTY          TIME CMD
 234897 pts/2    00:00:00 run.sh
 234899 pts/2    1-22:44:04 java
:
  1. Но почему это «плохой синтаксис»? /usr/share/doc/procps-3.2.8/FAQне очень помогает
  2. Какой будет «правильный синтаксис» для достижения того же результата?

В случае, если это важно:

$ 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
источник
5
А теперь самое сложное: какой ответ должен получить галочку?
sjngm
На самом деле я думал, что я должен позволить вам, пользователям, решать. Тот, у кого более высокие голоса, должен его получить. Но ты не облегчаешь это;)
sjngm
6
когда оба ответа одинаково хороши, я поднимаю оба голоса и ставлю галочку для пользователя с более низким повторением, особенно когда разница превышает 100 тысяч.
Фрэнк Томас,
1
@FrankThomas сделано :)
sjngm
В системах, основанных на SysV (или в тех, которые psпроисходят от этой линии вещей), я часто использую ps -fu $USER... получение ps -fвыходного форматирования, которое несколько похоже на ps uформатирование, но в то же время получение указания пользователя. В случае, если вы хотели оба одновременно.
lindes-hw

Ответы:

130

Правильный синтаксис, который возвращает тот же вывод :

ps u

Есть веская причина, по которой современный синтаксис ps- беспорядок. Исторически существовали две несовместимые версии ps. Опции с лидирующей чертой были унаследованы от версии AT & T Unix ps. Опции без передней черты были унаследованы от BSD. Версия psэтого дистрибутива Linux обычно использует GNU, которая объединила оба набора параметров, а также добавила свой собственный набор параметров, которые начинаются с лидирующей двойной тире.

Таким образом, ps uэто BSD-стиль и ps -u $USERAT & T-стиль. Тот факт, что GNU psпозволяет вам запускать ps -uи, кроме предупреждения, получать те же выходные данные, что и ps uпоказывает, что GNU пытается извлечь максимум из плохой ситуации.

John1024
источник
На самом деле, нет веских причин для беспорядка. Есть несколько плохих, и предполагаемая дихотомия «GNU» и «BSD» - ошибка, представленная страницей руководства Linux. См. Unix.stackexchange.com/a/511530/5132 .
JdeBP
84

У psкоманды исторически был совершенно другой синтаксис в BSD и System V Unix.

  • В BSDps , то uпараметр (без тира) не принимает параметра и показывает «ориентированные на пользователь выход» с дополнительными колоннами.

  • В SunOSps , то -uвариант (с тире) принимает имя пользователя в качестве параметра , и только включает в себя процессы , принадлежащие этому пользователю, но без изменения формата отображения.

(В качестве еще одного очень распространенного примера, BSD eозначает «показать среду», а SunOS -eозначает «показать процессы каждого».)

Linux procps ps пытается поддерживать оба стиля. Так что, если вы используете опцию 'dash' -u, она будет ожидать, что это SunOS "отфильтровать этого пользователя", а не опция расширенных столбцов. Однако они часто путаются, так что procps пытается сделать то, что вы имели в виду - если имя пользователя отсутствует, оно будет предполагать, что вы задали ему опцию BSD, но использовали синтаксис SunOS.

(На самом деле было так много разных вариантов того, psчто у procps есть фактическая таблица «личностей», чтобы заставить неоднозначное поведение интерпретироваться как тот или иной стиль или еще один - в дополнение к ручкам типа «UNIX95», «CMD_ENV», "_XPG", "I_WANT_A_BROKEN_PS" ...)

grawity
источник
29
"I_WANT_A_BROKEN_PS" хах.
42
... Сначала я подумал, что это шутка. Но нееееет ...
Иската
9
Хм, как выясняется, это как раз та опция, которая скрывает «неоднозначное использование» предупреждений, которые видит OP.
благодарность