Ocultando a saída de um comando

10

Eu tenho um script onde ele 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. Eu não tenho experiência alguma com o 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 as saídas dpkg -s net-tools e netstat -tlpn | grep 8080 | grep java no terminal, e não quero isso, como ocultar a saída e ficar com o resultado do if s?

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

    
por dabadaba 30.05.2014 / 19:44

3 respostas

19

Para ocultar a saída de qualquer comando, normalmente os stdout e stderr são redirecionados 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 stderr para stdout , portanto, os erros (se houver) também vão para /dev/null

Nota

&>/dev/null : redireciona os itens stdout e stderr para /dev/null . pode-se usá-lo como uma alternativa de /dev/null 2>&1

Silent grep : grep -q "string" corresponde a string de forma silenciosa ou silenciosa, sem nada para 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 estavam antes, mas não haverá saída.

Responda ao comentário :

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

if  [[ 'netstat -tlpn | grep 8080 | grep java' ]] &>/dev/null; then
    
por souravc 30.05.2014 / 19:57
1

lsof -i :<portnumnber> deve ser capaz de fazer algo nos moldes do que você deseja.

    
por Tim 30.05.2014 / 19:46
0

Embora a liberação da saída para /dev/null seja provavelmente a maneira mais fácil, às vezes /dev/null tem permissões de arquivo configuradas para que não-raiz não possa liberar a saída lá. Então, outra maneira não-raiz de fazer isso é por

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

Essa configuração de grep dupla localiza as linhas correspondentes com abc e desde que -o esteja definido SOMENTE abc é impresso e apenas uma vez por causa de -m 1 . Em seguida, a saída que está vazia ou abc é enviada ao grep para localizar apenas as partes da cadeia que correspondem a 123 e, como o último comando apenas retorna abc , a cadeia vazia é retornada. Espero que ajude!

    
por BoomBoomPowe 24.08.2017 / 20:33

Tags