Ocultando a Saída de um Comando

31

Eu tenho um script em que verifica se um pacote está instalado ou não e se a porta 8080 está sendo usada por um processo específico ou não. Não tenho experiência nenhuma com bash, então fiz algo assim:

if dpkg -s net-tools; then
    if  netstat -tlpn | grep 8080 | grep java; then
        echo "Shut down server before executing this script"
        exit
    fi
else
    echo "If the server is running please shut it down before continuing with the execution of this script"
fi

# the rest of the script...

No entanto, quando o script é executado, recebo dpkg -s net-toolsas netstat -tlpn | grep 8080 | grep javasaídas e o terminal, e não quero isso, como posso ocultar a saída e ficar com o resultado dos ifs?

Além disso, existe uma maneira mais elegante de fazer o que estou fazendo? E existe uma maneira mais elegante de saber qual processo está usando a porta 8080 (não apenas se estiver sendo usada), se houver?

dabadaba
fonte

Respostas:

53

Para ocultar a saída de qualquer comando geralmente o stdoute stderré redirecionado para /dev/null.

command > /dev/null 2>&1

Explicação:

1 command > /dev/null.: redireciona a saída de command(stdout) para /dev/null
2 2>&1.: redireciona stderrpara stdout, portanto erros (se houver) também vão para/dev/null

Nota

&>/dev/null: redireciona ambos stdoute stderrpara /dev/null. pode-se usá-lo como uma alternativa de/dev/null 2>&1

Silenciosogrep : grep -q "string"combine a string silenciosamente ou silenciosamente, sem nada com a saída padrão. Também pode ser usado para ocultar a saída.

No seu caso, você pode usá-lo como,

if dpkg -s net-tools > /dev/null 2>&1; then
    if  netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1; then
    #rest thing
else
    echo "your message"
fi

Aqui, as condições if serão verificadas como antes, mas não haverá saída.

Responder ao comentário :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: Está redirecionando a saída gerada grep javaapós o segundo canal. Mas a mensagem que você está recebendo netstat -tlpn. A solução é usar o segundo ifcomo,

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then
souravc
fonte
1
Você também poderia mencionar grep -q, eo mais recente festa &> ...como sinônimo de> ... 2>&1
steeldriver
obrigado, que melhorou o script. Mas ainda recebo uma mensagem dizendo que alguns processos não podem ser mostrados, pois não estão sendo executados como root. Isso acontece com netstat. Existe alguma maneira de esconder isso também?
dabadaba
1

lsof -i :<portnumnber> deve ser capaz de fazer algo como o desejado.

Tim
fonte
desculpe, eu esqueci de acrescentar a questão real para o post, verificá-lo contra agradar porque você resposta é apenas para as perguntas "secundárias"
dabadaba
Também existe uma maneira de extrair o nome do processo / PID da saída desse comando?
dabadaba
Outra maneira de fazer a mesma coisa é fuser -n tcp 8080, cuja saída pode ser mais fácil de analisar.
Fkraiem 30/05
0

Embora liberar a saída para /dev/nullprovavelmente seja a maneira mais fácil, às vezes /dev/nullhá permissões de arquivo definidas para que não-root não possam liberar a saída. Portanto, outra maneira não raiz de fazer isso é

command | grep -m 1 -o "abc" | grep -o "123"

Essa grepconfiguração dupla localiza as linhas correspondentes abce, como -oestá APENAS definido, abcé impressa e apenas uma vez por causa disso -m 1. Em seguida, a saída que está vazia ou abcé enviada ao grep para encontrar apenas as partes da string que correspondem 123e como o último comando apenas produz abca string vazia é retornada. Espero que ajude!

BoomBoomPowe
fonte