2012-02-14 12 views
12

Come posso ottenere il codice di uscita di wget dal processo di subshell?Ottieni il codice di uscita da subshell attraverso le pipe

Quindi, il problema principale è che $? è uguale a 0. Dove è possibile creare $?=8?

$> OUT=$(wget -q "http://budueba.com/net" | tee -a "file.txt"); echo "$?" 
0 

funziona senza tee, in realtà.

$> OUT=$(wget -q "http://budueba.com/net"); echo "$?" 
8 

Ma ${PIPESTATUS} array (io non sono sicuro che è legato a quel caso) anche non contiene tale valore.

$> OUT=$(wget -q "http://budueba.com/net" | tee -a "file.txt"); echo "${PIPESTATUS[1]}"  

$> OUT=$(wget -q "http://budueba.com/net" | tee -a "file.txt"); echo "${PIPESTATUS[0]}" 
0 

$> OUT=$(wget -q "http://budueba.com/net" | tee -a "file.txt"); echo "${PIPESTATUS[-1]}" 
0 

Quindi, la mia domanda è - come posso ottenere wget s' codice di uscita attraverso tee e subshell?

Se può essere utile, la mia versione di bash è 4.2.20.

risposta

13

Utilizzando $() si sta creando (in modo efficace) una subshell. Pertanto l'istanza di PIPESTATUS da consultare è disponibile solo all'interno della sottotitolazione (ovvero all'interno dello $()), poiché le variabili di ambiente non si propagano dai processi figlio a quello principale.

Si potrebbe fare qualcosa di simile:

OUT=$(wget -q "http://budueba.com/net" | tee -a "file.txt"; exit ${PIPESTATUS[0]}); 
    echo $? # prints exit code of wget. 

è possibile ottenere un comportamento simile utilizzando la seguente:

OUT=$(wget -q "http://budueba.com/net") 
    rc=$? # safe exit code for later 
    echo "$OUT" | tee -a "file.txt" 
+0

Ma è possibile esportare tutte le '$ {PIPESTATUS}' matrice fino alla shell del genitore? –

+1

Non funziona come ['export'] (http://www.gnu.org/software/bash/manual/bashref.html#Environment) - esporta le variabili come variabili d'ambiente per i processi * child * (dal genitore). –

+0

Ecco una [soluzione per portare l'intero array '$ {PIPESTATUS [@]}' nello script genitore] (https://stackoverflow.com/questions/41716616/get-exit-codes-of-a-pipe- quando-uscita-è-assigned-to-variabili-comando-substituti/44.314.883 # 44.314.883). Implica l'aggiunta alla fine della variabile creata e quindi la estrae in una nuova matrice. –

3

Attenzione a questo quando si utilizza local variabili:

local OUT=$(command; exit 1) 
echo $? # 0 

OUT=$(command; exit 1) 
echo $? # 1 
+3

Dichiarare 'local OUT' quindi assegnare' OUT = 'su una nuova riga imposta correttamente la variabile del codice di uscita' $? 'Se non si desidera che lo scope creep. –