Posso encadear o pgrep com kill?

31

Percebi que |é usado para enviar resultados do primeiro comando para o outro. Eu gostaria de matar todos os processos que correspondem a um nome.
Isto é o que o pgrep normalmente faz:

$ pgrep name
5089
5105

E vários argumentos parecem funcionar com kill:

sudo kill 5089 5105

Mas isso está errado:

pgrep name | kill

Então, como fazer isso corretamente?

Tomáš Zato - Restabelecer Monica
fonte
3
pkill. E se isso não existisse kill $(pgrep ...),.
Mikel
Eu não estava apenas perguntando por causa desses comandos específicos, mas também para entender melhor o encadeamento de comandos. Mas, como posso ver a partir da pontuação das perguntas, perguntas destinadas a entender não são bem-vindas ...
Tomáš Zato - Restabelecer Monica
Se você quiser tornar a pergunta mais geral e garantir que ela não seja duplicada, posso votar.
Mikel
Desculpe, excluí acidentalmente meu comentário anterior. Estou em um tablet e este site tem botões muito pequenos um ao lado do outro.
Mikel
Eu estava apenas dizendo que diminuí a votação porque sua pergunta não parecia estar perguntando nada do que você não poderia ter aprendido man pgrep. O botão de voto negativo diz que é para quando uma pergunta não mostra nenhum esforço de pesquisa e não consegui ver nada na sua pergunta. Desculpe se isso parecia duro.
Mikel

Respostas:

42

Tente o seguinte:

pgrep name | xargs kill

Se você usar pgrep name | kill, a saída de pgrep nameé feed para stdin de kill. Como killnão lê argumentos do stdin, isso não funcionará.

Usando xargs, ele criará argumentos para a killpartir do stdin. Exemplo:

$ pgrep bash | xargs echo
5514 22298 23079
cuonglm
fonte
5
Nada a ver com espaço versus nova linha. Simplesmente porque kill não lê argumentos no stdin.
Mikel
@ Mikel: Meu erro, corrigido.
cuonglm
17

Isso deve funcionar:

pkill name

Sugiro também a leitura da página de manual.

Rouben Tchakhmakhtchian
fonte
5

Para responder ao geral e não ao específico ...

Os tubos são para passar a saída de um programa como entrada para outro programa.

Parece que você está tentando usar a saída de um programa como argumentos de linha de comando para outro programa, o que é diferente.

Para fazer isso, use substituição de comando .

Por exemplo, se você deseja executar

sudo kill 5089 5105

E você tem um comando pgrep nameque gera5089 5105

Você os junta como

sudo kill $(pgrep name)
Mikel
fonte
Muito obrigado. Espero que isso ajude outros iniciantes também.
Tomáš Zato - Restabelece Monica