Трубопровод выходной для резки - PullRequest
14 голосов
/ 22 февраля 2012

Я пытаюсь получить имя оболочки, выполняющей сценарий.

Почему

echo $(ps | grep $PPID) | cut -d" " -f4

работает, а

echo ps | grep $PPID | cut -d" " -f4

- нет?

Ответы [ 4 ]

20 голосов
/ 22 февраля 2012

Причина в том, что

echo ps

просто распечатывает строку ps; программа не запускается ps. Исправленная версия вашей команды будет:

ps | grep $PPID | cut -d" " -f4

Отредактировано, чтобы добавить: paxdiablo указывает, что ps | grep $PPID включает много пробелов, которые будут свернуты на echo $(ps | grep $PPID) (начиная с результата $(...), когда он не в двойных кавычках, разделяется пробелами на отдельные аргументы, а затем echo выводит все свои аргументы, разделенные пробелами). Чтобы решить эту проблему, вы можете использовать tr для «сжатия» повторяющихся пробелов:

ps | grep $PPID | tr -s ' ' | cut -d' ' -f5

или вы можете просто придерживаться того, с чего вам пришлось начать. : -)

6 голосов
/ 22 февраля 2012

Первая строка:

echo $(ps | grep $PPID) | cut -d" " -f4

говорит:

  • Выполнить ps | grep $PPID в под-оболочке
  • Вернуть вывод, которыйбудет выглядеть примерно так:

    3559 pts/1 00:00:00 bash
    

    , а затем использовать этот вывод в качестве первого параметра echo - что на практике означает просто повторить вывод

  • Затем запустите cut -d" " -f4 на это - которое дает вам имя команды в этом случае

Вторая команда:

echo ps | grep $PPID | cut -d" " -f4

говорит:

  • Строка эха ps
  • Grep эту строку для $PPID - она ​​никогда ничего не вернет, поскольку $PPID содержит число, поэтому оно никогда не будет ps.Таким образом, grep ничего не возвращает
  • Выполните cut -d" " -f4 с вводом предыдущей команды - это ничто, поэтому вы ничего не получите
2 голосов
/ 22 февраля 2012

Я думаю, что если вы запустите только echo ps самостоятельно, вы поймете, почему ваша труба не работает:

$ echo ps
ps

Вместо этого отметьте $0.Обратите внимание, что это может быть -bash или bash, в зависимости от того, является ли это оболочкой входа .(Ну, любая оболочка - не просто bash - но дефис добавляется, если оболочка является оболочкой входа в систему.)

0 голосов
/ 19 июня 2018

Для многих применений лучше всего нам tr. Например:

Входной сигнал: echo "field1,field2,field3" | tr , \\n Выход: field1 field2 field3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...