Impossibile acquisire l'output in variabile in Bash


15

Problemi con redis-cli. Voglio verificare se la connessione redisviene rifiutata (server inattivo), tramite BASH.

Test semplice

#!/bin/bash
test=$(redis-cli exit) #exit out of the "not connected console"
if [[ -z $test ]] ; then
    echo "I'm empty :("
fi

Mi aspetterei Could not connect to Redis at 127.0.0.1:6379: Connection refuseddi essere archiviato in $ test, ma questo testo viene invece inviato alla console.

Non sono sicuro di cosa stia succedendo. Qualcuno ha qualche idea?

(Ubuntu 14.04.1)


Si noti che if [[ -z $test ]]quasi sicuramente si espanderà a if [[ -z ]]quando $testdiventa vuoto, il che sembra infrangere il condizionale. Per proteggersi da questo, è sufficiente mettere la variabile tra virgolette: if [[ -z "$test" ]] ; then.
un CVn

In realtà penso che le versioni più recenti di bash lo gestiscano. Sembra funzionare nei miei test comunque.
DarkNeuron

Bene, allora buon per te. :-) Tendo ad apprezzare la rete di sicurezza aggiuntiva, se non altro per preservare la mia sanità mentale quando guardo il codice in seguito ...
un CVn

Risposte:


20

Questo perché il messaggio di errore viene inviato al flusso STDERR (descrittore di file 2), non a STDOUT (descrittore di file 1) che si sta acquisendo con la sostituzione dei comandi $().

Concentrandosi solo su come ottenere la stringa, su STDOUT o STDERR:

test="$(redis-cli exit 2>&1)"

in tal caso il [ -z "$test" ]test produrrà falsi positivi poiché il messaggio di errore verrà archiviato nella variabile. Invece puoi fare:

#!/bin/bash
test="$(redis-cli exit 2>/dev/null)"
if [[ -z $test ]] ; then
    echo "I'm empty :("
fi

Inoltre penso che questo dovrebbe ottenere quello che vuoi dato che lo stato di uscita è banale:

if redis-cli exit &>/dev/null; then
    echo 'Succeeded!!'
else
    echo 'Failed!!'
fi

Ah certo. È un errore! :)
DarkNeuron

Inoltre, richiede problemi (anche solo un po ') per usare il nome di un comando integrato (ed eseguibile) - "test" per un nome di variabile, quindi testare lo stato di uscita come nella seconda soluzione è meglio per anche questa ragione.
Joe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.