Comprobar el éxito del command en bash

Actualmente estoy escribiendo una pequeña secuencia de commands para hacer copys de security de los bloques de disquetes y formatearlos para su uso posterior.

Yo uso dd para copyr la image del disco y cp para copyr todos los files en el disco.

Aquí están los commands que uso para hacerlo:

 # Copying disk image dd if="/dev/fd0" of="/path/to/backup/folder" &>/dev/null && sync # Copying disk files cp -R "/mnt/floppy/." "/path/to/backup/folder/" &>/dev/null 

Después de este process, la secuencia de commands debe formatear el disquete. Mi problema es que quiero que mi secuencia de commands formatee el disquete solo si ambos commands de copy de security ( dd y cp ) tuvieron éxito.

Por ejemplo, si dd no puede copyr todos los 1.44MB del disquete debido a los bloques defectuosos, entonces no formatee el disquete.

¿Cómo puedo probar si ambos commands fueron exitosos (deben ser probados por separado, ya que no siempre hago una copy de security de la image y los files del disco)?

Como usas bash solo agrega:

 set -e 

al comienzo de su script y fallará cada vez que falle alguno de los commands.

Prueba con:

 dd <command> DD_EXIT_STATUS=$? cp <command> CP_EXIT_STATUS=$? if [[ DD_EXIT_STATUS -eq 0 && CP_EXIT_STATUS -eq 0 ]]; then format floppy disk else ... other stuff ... fi 

Cuando ejecuta un command en un shell Bourne, el código de salida se almacena en la variable, $? . (Almacena el código de salida del último command ejecutado). Puede usar esto para evaluar los códigos de salida usando if-then o declaraciones de casos … por ejemplo …

 command retval=$? case $retval in 0) echo "Exit code 0" ;; 1) echo "Exit code 1" ;; 2) echo "Exit code 2" ;; esac 

O…

 command case $? in [...] 

Usted tiene la syntax que necesita en su primer command dd : el && significa "ejecutar solo lo que viene después si lo que viene antes tiene éxito".

La instrucción if toma un command (¡o una serie de commands!) Y los ejecuta, y luego verifica el valor de éxito al final. Entonces podrías hacer:

 if dd etc. etc. && sync && cp etc. etc. then format etc. fi 

Lo haría:

 ok=true if dd ...; then sync else ok=false fi cp ... || ok=false if "$ok"; then mformat... fi 

Una testing de una sola línea sería

 command_to_check && command_to_follow_if_previous_one_succeeds 

También puede usar el siguiente delineador si desea continuar solo si el command anterior falla.

 command_to_check || command_to_follow_if_previous_one_fails