bash a variável não mantém o resultado do comando

0

Problema:

O armazenamento do resultado do comando na variável portcheck não funciona como esperado. Meu script contém esse método

#!/bin/bash
...

status() {
    portcheck=$(nc -z -v -w5 localhost 8443)
    echo "*${portcheck}*"
    if [[ $portcheck == *refused* ]]; then
          echo "Application is stopped"
    elif [[ $portcheck == *succeeded* ]]; then
          echo "Application is started"
    else
          echo "state unknown"
    fi
}

Quando executo o myscript, recebo este resultado:

> $  ./myscript status 
> Connection to localhost 8443 port [tcp/*] succeeded!
> ** 
> state unknown

Mas o que eu gostaria de ter é que o resultado do comando é armazenado em variável portcheck e a saída deve se parecer com

> $  ./myscript status 
> Connection to localhost 8443 port [tcp/*] succeeded!
> *Connection to localhost 8443 port [tcp/*] succeeded!* 
> Application is started

Eu tentei várias variantes de acordo link e outros por exemplo,

portcheck='nc -z -v -w5 localhost 8443'

em vez de

portcheck=$(nc -z -v -w5 localhost 8443)

Mas não funcionou. O que estou fazendo errado?

Histórico:

O comando

nc -z -v -w5 localhost 8443

verifica se a porta é conectável. Ele retorna

Connection to localhost 8443 port [tcp/*] succeeded!

se a porta estiver "aberta" e

nc: connect to localhost port 8443 (tcp) failed: Connection refused

se a porta estiver "fechada".

Isso funciona bem se eu apenas executar o comando plain no bash.

    
por Mayoares 17.11.2017 / 11:57

1 resposta

1

A chamada nc basicamente imprime para stderr e você precisa enviar a saída para stdout da seguinte forma:

portcheck=$(nc -z -v -w5 localhost 8443 2>&1)
echo "*${portcheck}*"

Esta seria a saída, neste caso:

*Connection to localhost 8443 port [tcp/*] succeeded!*
    
por 17.11.2017 / 12:42