Concatenar variável na string bash

1

Eu quero matar um processo na porta especificada (variável)

export PORT=3030
netstat -ntlp | awk '$4~/:*${PORT}$/{gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'

mas a variável PORT não entra no comando.

    
por user115561 27.03.2012 / 21:12

4 respostas

5

use lsof para esta tarefa:

PORT=3030
kill $(lsof -t -ni:$PORT)
    
por 27.03.2012 / 21:26
4

Tente usar aspas duplas para agrupar o comando awk em vez de aspas simples. O Bash não substitui as variáveis entre aspas simples.

Você precisará alterar as aspas duplas dentro do comando para aspas simples ou para excluí-las com uma barra invertida.

    
por 27.03.2012 / 21:18
1

Adicionando a respostas anteriores, apenas para mostrar uma maneira de corrigir seu método:

netstat -ntlp | awk '$4 ~ PORT {gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}' PORT='3030'

ou

export PORT=3030
netstat -ntlp | awk '$4~ ENVIRON["PORT"] {gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'
    
por 27.03.2012 / 22:22
0

A aspa simples pede ao shell que passe a string anexada sem qualquer alteração. Portanto, ${PORT} não é traduzido para 3030. É apenas um grupo de caracteres como qualquer outra string.

Use apenas isto: '$4~/:*'${PORT}'$/{gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'
Você fecha a aspas simples antes de ${port} e reabre-as logo após (sem espaço). Isso permitirá que o shell translate sua variável.

    
por 27.03.2012 / 22:25