Como parar o .bashrc de executar o subcomando no alias na inicialização? [duplicado]

8

Eu adicionei um comando alias para matar meu guake terminal para meu .bashrc

alias killguake="kill -9 $(ps aux | grep guake | head -n -1 | awk '{print $2}')"

Mas o problema é que o subcomando, por exemplo, ps aux | grep guake | head -n -1 | awk '{print $2}' , é executado no momento da inicialização do terminal e killguake é definido como kill -9 result_of_subcommand .

Existe alguma maneira de defini-lo assim, que o subcomando é executado / calculado toda vez que eu executo killguake ? Para que ele possa ter o mais recente PID para o roubo.

Eu também tentei canalizar o kill usando xargs , mas isso também resulta no mesmo, que é calcular tudo na inicialização. Aqui está o que eu tentei com a tubulação

ps aux | grep guake | head -n -1 | awk '{print $2}' | xargs -I{} kill -9 {}
    
por Muhammad Tahir 17.01.2017 / 08:46

2 respostas

23

Use pkill :

alias killguake='pkill guake'

Isso é muito mais seguro do que tentar analisar a tabela de processos gerada por ps .

Tendo dito isso, explicarei agora porque seu alias não faz o que você quer, mas, na verdade, use pkill .

Seu alias

alias killguake="kill -9 $(ps aux | grep guake | head -n -1 | awk '{print $2}')"

tem aspas duplas. Isso significa que quando o shell analisa essa linha no seu script de inicialização do shell, ele executará substituições de comando ( $( ... ) ). Portanto, cada vez que o arquivo for executado, em vez de fornecer um alias para matar guake posteriormente, ele fornecerá um alias para eliminar o processo guake em execução agora .

Se você listar seus aliases (com alias ), verá que esse alias é parecido com

killguake='kill -9 91273'

ou possivelmente apenas

killquake='kill -9'

se guake não estava sendo executado no momento da inicialização do shell.

Para consertar isso (mas realmente, use apenas pkill ) você precisa usar aspas simples e escapar do $ no script Awk (que agora está entre aspas):

alias killguake='kill -9 $(ps aux | grep guake | head -n -1 | awk "{print \}")'

Um dos problemas com esta abordagem em geral é que você irá combinar os processos pertencentes a outros usuários. Outra é que você encontrará apenas o comando grep guake em vez do processo pretendido. Outra é que ele lançará um erro se nenhum processo for encontrado. Outra é que você está invocando cinco utilitários externos para fazer o trabalho de um.

    
por 17.01.2017 / 08:59
6

Use pkill, não reinvente a roda!

alias killguake="pkill -9 guake"
    
por 17.01.2017 / 08:50