Il convient de noter que if...then...fi
y &&
/ ||
Ce type d'approche traite l'état de sortie renvoyé par la commande que nous voulons tester (0 en cas de succès) ; cependant, certaines commandes ne renvoient pas d'état de sortie différent de zéro si la commande a échoué ou n'a pas pu traiter l'entrée. Cela signifie que l'approche habituelle if
y &&
/ ||
ne fonctionneront pas pour ces commandes particulières.
Par exemple, sous Linux, GNU file
se termine toujours avec 0 s'il a reçu un fichier non existant comme argument et find
n'a pas pu localiser le fichier spécifié par l'utilisateur.
$ 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
Dans de tels cas, une façon potentielle de gérer la situation consiste à lire stderr
/ stdin
les messages, par exemple ceux qui sont renvoyés par les file
ou analyser la sortie de la commande comme dans la commande find
. À cette fin, case
pourrait être utilisée.
$ 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
( Ceci est une reprise de ma propre réponse sur question connexe à unix.stackexchange.com )