Cabe señalar que if...then...fi
y &&
/ ||
tipo de enfoque trata con el estado de salida devuelto por comando que queremos probar (0 en caso de éxito); sin embargo, algunos comandos no devuelven un estado de salida distinto de cero si el comando falló o no pudo manejar la entrada. Esto significa que los enfoques habituales if
y &&
/ ||
no funcionarán para esos comandos en particular.
Por ejemplo, en Linux, GNU file
todavía sale con 0 si recibió un archivo no existente como argumento y find
no pudo ubicar el archivo especificado por el usuario.
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
En tales casos, una forma potencial de manejar la situación es mediante la lectura stderr
/ stdin
mensajes, por ejemplo, aquellos que regresaron por file
comando, o analizar la salida del comando como en find
. Para ese propósito, se case
podría usar una declaración.
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
(Este es un reenvío de mi propia respuesta a una pregunta relacionada en unix.stackexchange.com )