2012-02-14 7 views
12

¿Cómo puedo obtener el código de salida wget del proceso de subshell?Obtenga el código de salida de subshell a través de las tuberías

Entonces, el principal problema es que $? es igual a 0. ¿Dónde se puede encontrar $?=8?

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

Funciona sin tee, en realidad.

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

Pero ${PIPESTATUS} array (no estoy seguro de que está relacionado con ese caso) tampoco contiene ese valor.

$> 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 

lo tanto, mi pregunta es - ¿Cómo puedo obtener wget 's código de salida a través tee y subnivel?

Si puede ser útil, mi versión de bash es 4.2.20.

Respuesta

13

Al usar $() está (efectivamente) creando una subshell. Por lo tanto, la instancia PIPESTATUS que necesita ver solo está disponible dentro de su subshell (es decir, dentro del $()), ya que las variables de entorno no se propagan de procesos secundarios a principales.

se podría hacer algo como esto:

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

se puede lograr un comportamiento similar utilizando la siguiente:

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

pero ¿es posible exportar todos los '$ {PIPESTATUS}' matriz de arriba para el shell de los padres? –

+1

No es así como funciona ['export'] (http://www.gnu.org/software/bash/manual/bashref.html#Environment): exporta variables como variables de entorno para procesos * child * (desde el padre) –

+0

Aquí hay una [solución para llevar toda la matriz '$ {PIPESTATUS [@]}' al script principal] (https://stackoverflow.com/questions/41716616/get-exit-codes-of-a-pipe- when-output-is-assigned-to-variable-command-substituti/44314883 # 44314883). Implica agregarlo al final de la variable creada y luego extraerlo en una nueva matriz. –

0

Copiar la matriz PIPESTATUS primero. Cualquier lectura destruye el estado actual.

declare -a PSA 
cmd1 | cmd2 | cmd3 
PSA=("${PIPESTATUS[@]}") 

Utilicé fifos para resolver el problema de la subcapa/PIPESTATUS. Ver bash pipestatus in backticked command?
También encontré estos útiles: bash script: how to save return value of first command in a pipeline?
y https://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another/70675#70675

3

Cuidado con este cuando se utiliza local variables:

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

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

Declarar 'local OUT' y luego asignar 'OUT =' en una nueva línea establece correctamente la variable del código de salida '$?' Si no desea que se extienda el alcance. –

Cuestiones relacionadas