Czy mogę połączyć pgrep z funkcją kill?

31

Zauważyłem, że |służy do przesyłania wyników pierwszego polecenia do drugiego. Chciałbym zabić wszystkie procesy, które pasują do nazwy.
Oto co zwykle robi pgrep:

$ pgrep name
5089
5105

Wydaje się, że działa wiele argumentów kill:

sudo kill 5089 5105

Ale to źle:

pgrep name | kill

Jak to zrobić poprawnie?

Tomáš Zato - Przywróć Monikę
źródło
3
pkill. A jeśli to nie istnieje kill $(pgrep ...).
Mikel
Nie tylko pytałem o te konkretne polecenia, ale także, aby lepiej zrozumieć łańcuch poleceń. Ale jak widzę na podstawie wyniku pytania, pytania, które należy zrozumieć, są niepożądane ...
Tomáš Zato - Przywróć Monikę
Jeśli chcesz uogólnić pytanie i upewnić się, że nie jest to duplikat, mogę głosować.
Mikel
Przepraszam, przypadkowo usunąłem mój poprzedni komentarz. Jestem na tablecie, a ta strona ma naprawdę małe przyciski obok siebie.
Mikel
Mówiłem tylko, że zagłosowałem, ponieważ twoje pytanie nie wydawało się zadawać czegokolwiek, czego nie mogłeś się nauczyć man pgrep. Przycisk downvote mówi, że dzieje się tak, gdy pytanie nie pokazuje wysiłku badawczego, a ja nie widziałem żadnego w twoim pytaniu. Przepraszam, jeśli to wydawało się trudne.
Mikel

Odpowiedzi:

42

Spróbuj tego:

pgrep name | xargs kill

Jeśli używasz pgrep name | kill, wyjście pgrep namejest przesyłane do standardowego kill. Ponieważ killnie odczytuje argumentów ze standardowego wejścia, więc to nie zadziała.

Używając xargs, zbuduje argumenty killze standardowego wejścia. Przykład:

$ pgrep bash | xargs echo
5514 22298 23079
Cuonglm
źródło
5
Nie ma nic wspólnego z przestrzenią w porównaniu do nowej linii. Po prostu dlatego, że kill nie czyta argumentów na standardowym wejściu.
Mikel
@Mikel: Mój błąd naprawiony.
cuonglm
17

To powinno działać:

pkill name

Sugeruję również przeczytanie strony podręcznika.

Rouben Tchakhmakhtchian
źródło
5

Aby odpowiedzieć na ogólne, a nie szczegółowe ...

Rury służą do przekazywania danych wyjściowych z jednego programu jako danych wejściowych do innego programu.

Wygląda na to, że próbujesz użyć danych wyjściowych jednego programu jako argumentów wiersza poleceń innego programu, który jest inny.

Aby to zrobić, użyj podstawiania poleceń .

Na przykład, jeśli chcesz uruchomić

sudo kill 5089 5105

I masz polecenie, pgrep namektóre wydaje5089 5105

Złożyłeś je razem

sudo kill $(pgrep name)
Mikel
źródło
Wielkie dzięki. Mam nadzieję, że pomoże to również innym początkującym.
Tomáš Zato - Przywróć Monikę