A veces hay dos comandos que suelo invocar seguidos. Sin embargo, el segundo comando solo tiene sentido en caso de que el primer comando haya tenido éxito.
Quería hacer algo como esto:
#!/bin/bash if [ $? -gt 0 ] then echo "WARNING: previous command entered at the shell prompt failed" fiPero no funciona:
t@quad:~$ echo "abc" | grep def t@quad:~$ ./warnme.sh Last command succeededLo que me gustaría es algo un poco como esto:
t@quad:~$ echo "abc" | grep def t@quad:~$ echo ${PIPESTATUS[1]} 1Donde podemos ver claramente que el último comando falló.
El resultado que me gustaría tener:
t@quad:~$ echo "abc" | grep def t@quad:~$ ./warnme.sh WARNING: previous command entered at the shell prompt failedNo puedo encontrar una manera de hacerlo.
command1 && command2hace exactamente lo que desea: el comando 2 se ejecuta solo si el comando 1 tiene éxito. Por ejemplo podrías hacer:
ls a.out && ./a.outEntonces a.out solo se ejecutaría si pudiera aparecer en la lista. Hice un wikiblog sobre esto en http://www.linuxintro.org/wiki/%26%26
Una opción es poner esto justo antes de la lista de comandos que desea ejecutar solo si el anterior fue exitoso:
set -eEsto cerrará la secuencia de comandos si alguno de los comandos que le siguen devuelve un valor distinto de cero (generalmente un error). Puedes apagarlo de nuevo con:
set +eO si prefiere apagarlo solo por una línea, puede simplemente hacer lógico-O el comando con verdadero:
mycommand || truePara muchas de mis secuencias de comandos, he configurado -e en la parte superior de la secuencia de comandos como una característica de seguridad para evitar que la secuencia de comandos caiga en cascada y haga algo peligroso.
Qué tal si:
echo "abc" | grep def || ./warnme.shDonde warnme.sh ahora es solo la advertencia sin la prueba. Solo se llama si falla el primer comando.
En otras palabras, sería lo mismo que:
echo "abc" | grep def || echo "WARNING: That didn't work..."