Можно ли поместить оператор if в конвейер? - PullRequest
0 голосов
/ 31 марта 2020
ps aux | grep node | grep -v grep | awk '{print $2}' | xargs kill -9

Я использую приведенную выше команду, чтобы убить все Node.js процессы (Ubuntu), но если не запущен ни один из процессов узла, он выдаст ошибку (stderr). Можно ли использовать оператор if в конвейере, чтобы xargs ничего не получал?

Что-то вроде:

ps aux | grep node | grep -v grep | awk '{print $2}' | if [ $pip ] ; then
    xargs kill -9 $pip
fi

Ответы [ 3 ]

2 голосов
/ 31 марта 2020

man xargs:

   -r, --no-run-if-empty
          If the standard input does not contain any nonblanks,
          do not run the command.  Normally, the command is run
          once even if there is no input. This option is a GNU
          extension.
1 голос
/ 31 марта 2020

Другие ответы верны и, вероятно, решают возможную проблему XY, но не отвечают на заголовок вопроса.

Да, в трубе можно использовать «если». Например:

cd /tmp
touch a1 a2 a3
ls    # results a1 a2 a3 systemd-private...
ls | grep ^a | if grep a1; then echo yes; done

приводит к:

a1
да

и

ls | grep ^a | if grep -e a1 -e a2; then echo yes; done  

выходы

a1
a2
да

Что здесь происходит? То, что конвейер выполняется нормально, потому что «если» выполняет свое условие. После того, как конвейер завершен, «if» все еще живо, получает результат выхода из своего аргумента и выполняет то, что ему предлагается (здесь «echo yes», только если grep действительно нашел какое-либо соответствие).

Чтобы получить еще одно доказательство:

ls | grep ^a | if grep a4; then echo yes; done

не приводит к печати ничего, ничего из стандартного вывода и, что более важно, никакое «эхо да» не было выполнено.

Это может быть в некоторых случаях полезно сделать что-то в конце обработки, но я сомневаюсь, что это может иметь много других применений.

1 голос
/ 31 марта 2020

Если вы в Ubuntu, взгляните на pkill. Следует позаботиться обо всем трубопроводе.

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