Diferença entre “kill | pgrep dnsspoof ”e“ kill 'pgrep dnsspoof' ”

0

Eu acredito que | é usado para fornecer a saída de um programa como uma entrada para outro. Então eu tentei kill | pgrep dnsspoof mas não funcionou. Então eu tentei

kill 'pgrep dnsspoof'

e funcionou. Alguém pode me dizer como esses comandos funcionam internamente?

    
por 7_R3X 07.12.2016 / 07:11

2 respostas

3

Você está correto de que | alimenta a saída de um programa para outro. Os dados fluem left para right . Então você pode pensar que

pgrep dnsspoof | kill

deve funcionar, pois pgrep encontrará o número do processo de dnsspoof e alimentará esse valor em kill , o que o mataria. Acontece que isso não funciona, já que o kill só olha para a linha de comando para matar as coisas.

Portanto, temos que obter a saída de pgrep na linha de comando. Isso é o que %código% ou o mais moderno 'pgrep dnsspoof' , ele executa o comando dentro dos backticks ou colchetes e coloca a saída no lugar do comando. Portanto, se $(pgrep dnsspoof) produzir pgrep dnsspoof , o comando executado será 5432 , que é a maneira correta de chamar o programa kill.

Usar kill 5432 tem várias vantagens, é mais fácil aninhar, menos coisas precisam ser escapadas, então se o seu shell suportar, então você deve usá-las em preferência para $( ) .

    
por 07.12.2016 / 07:43
1

Você está certo sobre | , mas está executando o comando de maneira oposta, você deve executar pgrep dnsspoof e enviar sua saída para entrada para kill , mas ele não aceita seus comandos no padrão, eles espere que seja escrito nos argumentos para o comando, então você tem que usar xargs que lê os dados do fluxo STDIN e converte cada linha em argumentos separados por espaço para o comando:

pgrep dnsspoof | xargs kill

mas no seu caminho você está enviando a saída do comando kill para ser como entrada para pgrep dnsspoof e isso não faz sentido

    
por 07.12.2016 / 07:26

Tags