Я играю вокруг с каналами, чтобы изучить, как использовать их. Я пробую эту команду для уничтожения процесса по имени: pgrep <some_process> | kill
но вывод, который я получаю, является инструкцией по использованию для уничтожения, как он не получил входа.
конечно, я знаю, что существует более легкий способ выполнить ту же задачу как pkill
или killall
, но я хочу знать, почему это не работает.
Спасибо
kill
ничего не читает из stdin, но ожидает некоторую командную строку args и бросает ошибку, если это не получает их.
Передающий по каналу только работает, если программа на правой стороне канала на самом деле читает из канала. Не все программы делают.
Как 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
Для того, чтобы закрыть программу ее именем, если Вы на самом деле знаете имя процесса, Вы могли бы просто использовать команду skill <your process name>
;
Теперь для каналов, хороший способ понять их играет вокруг с инструментами как echo
, more
, less
, tail
, head
, и т.д. существует много программ, которые могут на самом деле читать из канала... один, я всегда использовал, grep
.