2011-12-06 22 views
5

En bash, sé que debería utilizar && si quiero un comando B que se ejecute sólo después de comandos A tiene éxito:¿Cómo puedo ejecutar un comando solo después de que otros comandos se hayan ejecutado correctamente?

A && B 

Pero lo que si quiero D para ejecutarse sólo después A, B, C todo ¿tener éxito? Es

'A&B&C' && D 

OK?

Además, ¿qué debería hacer si quiero saber exactamente qué comando fracasó, entre A, B y C (ya que se ejecutarán en muchas ocasiones, se tardará un tiempo si puedo comprobar uno por uno).

¿Es posible que la información de error salga automáticamente a un archivo de texto tan pronto como falle un comando?

En mi caso, A, B, C son curl mientras B es rm, y mi escritura es así:

for f in * 
do 
    curl -T server1.com 
    curl -T server2.com 
    ... 
    rm $f 
done 
+0

¿Desea ejecutar 'B' y' C' si 'A' falla? 'A && B && C && D' se cerrará tan pronto como falle un comando. Pero si quiere ejecutar 'A',' B', y 'C' incondicionalmente, y luego ejecutar' D' solo si todos tuvieron éxito, entonces vea la respuesta de @Adam. (No, 'A & B & C && D' no hará lo que quiera; el simple' & 'hace que el comando se ejecute en segundo plano.) –

+0

Gracias por su edición :) – erical

+0

¿puede usar paréntesis? – Gabriel

Respuesta

0

que pueda obtener el retorno del comando anterior haciendo es decir

comando; echo $?

1 = fallaron 0 = éxito

En un formato más estructurado, ejemplo:

cat /var/log/secure 
    if [ $? -ne "1" ] ; then 
    echo "Error" ; exit 1 
    fi 
+0

Gracias por su ayuda :) – erical

5

Prueba esto:

A; A_EXIT=$? 
B; B_EXIT=$? 
C; C_EXIT=$? 
if [ $A_EXIT -eq 0 -a $B_EXIT -eq 0 -a $C_EXIT ] 
then 
    D 
fi 

Las variables A_EXIT, B_EXIT y C_EXIT le indican el , en su caso, del comando A, B, C s fallado Puede enviar a un archivo en una declaración adicional if después de cada comando, p.

A; A_EXIT=$? 
if [ $A_EXIT -ne 0 ] 
then 
    echo "A failed" > text_file 
fi 
+0

Gracias por su ayuda, ¿puede decir qué significa "$?" Me parece que a menudo lo encuentro en script bash, pero no se puede buscar en google – erical

+0

$? es la variable especial de shell que contiene el estado del último comando de primer plano. Un buen lugar para buscar estas cosas es bash manpage: http://linux.die.net/man/1/bash –

+0

¡Oh, gracias! Es un sitio muy útil – erical

1

¿por qué no almacena sus comandos en una matriz, y luego itera sobre ella, sale cuando falla?

#!/bin/bash 

commands=(
    [0]="ls" 
    [1]="ls .." 
    [2]="ls foo" 
    [3]="ls /" 
) 

for ((i = 0; i < 4; i++)); do 
    ${commands[i]} 
    if [ $? -ne 0 ]; then 
     echo "${commands[i]} failed with $?" 
     exit 
    fi 
done 
+0

Gracias por su ayuda :) – erical

Cuestiones relacionadas