то, почему передает вывод pgrep по каналу в уничтожение, не работает

Я играю вокруг с каналами, чтобы изучить, как использовать их. Я пробую эту команду для уничтожения процесса по имени: pgrep <some_process> | kill

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

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

Спасибо

1
задан 2 November 2014 в 11:54

3 ответа

kill ничего не читает из stdin, но ожидает некоторую командную строку args и бросает ошибку, если это не получает их.

Передающий по каналу только работает, если программа на правой стороне канала на самом деле читает из канала. Не все программы делают.

3
ответ дан 10 November 2019 в 18:22

Как Florian объяснил, kill ожидает исходные данные командной строки.

Для обхождения проблемы можно использовать

  • xargs для создания параметров командной строки для команды, например, pgrep vivaldi | xargs kill или еще лучше pgrep vivaldi | awk 'BEGIN{ORS=" "} 1' | xargs kill
  • замена оболочки: kill $(pgrep vivaldi)
  • killall, который делает в значительной степени то же задание как pgrep и уничтожать объединенный, например, killall vivaldi
  • pkill, другая утилита для уничтожения на основе имени, например, pkill vivaldi
2
ответ дан 10 November 2019 в 18:22

Для того, чтобы закрыть программу ее именем, если Вы на самом деле знаете имя процесса, Вы могли бы просто использовать команду skill <your process name>;

Теперь для каналов, хороший способ понять их играет вокруг с инструментами как echo, more, less, tail, head, и т.д. существует много программ, которые могут на самом деле читать из канала... один, я всегда использовал, grep.

0
ответ дан 10 November 2019 в 18:22

Другие вопросы по тегам:

Похожие вопросы: