¿Puedo encadenar pgrep con kill?

31

He notado que |se usa para enviar resultados del primer comando al otro. Me gustaría matar todos los procesos que coinciden con un nombre.
Esto es lo que normalmente hace pgrep:

$ pgrep name
5089
5105

Y múltiples argumentos parecen funcionar con kill:

sudo kill 5089 5105

Pero esto está mal:

pgrep name | kill

Entonces, ¿cómo hacerlo correctamente?

Tomáš Zato - Restablece a Monica
fuente
3
pkill. Y si eso no existía, kill $(pgrep ...).
Mikel
No solo preguntaba por esos comandos específicos, sino también para comprender mejor el encadenamiento de comandos. Pero como puedo ver en el puntaje de la pregunta, las preguntas destinadas a entender no son bienvenidas ...
Tomáš Zato - Restablece a Mónica el
Si desea hacer la pregunta más general y asegurarse de que no sea un duplicado, puedo votarla.
Mikel
Lo sentimos, borré accidentalmente mi comentario anterior. Estoy en una tableta y este sitio tiene botones realmente pequeños uno al lado del otro.
Mikel
Solo decía que voté en contra porque su pregunta no parecía estar haciendo nada de lo que no podría haber aprendido man pgrep. El botón de voto negativo dice que es para cuando una pregunta no muestra ningún esfuerzo de investigación, y no pude ver ninguna en su pregunta. Lo siento si eso pareció duro.
Mikel

Respuestas:

42

Prueba esto:

pgrep name | xargs kill

Si lo usa pgrep name | kill, la salida de pgrep namese alimenta a stdin de kill. Porque killno lee argumentos de stdin, por lo que esto no funcionará.

Utilizando xargs, generará argumentos para killdesde stdin. Ejemplo:

$ pgrep bash | xargs echo
5514 22298 23079
Cuonglm
fuente
55
Nada que ver con el espacio versus la nueva línea. Simplemente porque kill no lee argumentos en stdin.
Mikel
@ Mikel: Mi error, corregido.
Cuonglm
17

Esto debería funcionar:

pkill name

También sugiero leer la página del manual.

Rouben Tchakhmakhtchian
fuente
5

Para responder a lo general en lugar de lo específico ...

Las tuberías son para pasar la salida de un programa como entrada a otro programa.

Parece que está intentando usar la salida de un programa como argumentos de línea de comando para otro programa, que es diferente.

Para hacer eso, use la sustitución de comandos .

Por ejemplo si quieres correr

sudo kill 5089 5105

Y tienes un comando pgrep nameque genera5089 5105

Los pones juntos como

sudo kill $(pgrep name)
Mikel
fuente
Muchas gracias. Espero que esto ayude a otros principiantes también.
Tomáš Zato - Restablece a Monica el