Deve-se observar que o tipo de abordagem if...then...fi
e &&
/ ||
lida com o status de saída retornado pelo comando que queremos testar (0 no sucesso); no entanto, alguns comandos não retornam um status de saída diferente de zero se o comando falhar ou não puder lidar com a entrada. Isso significa que as abordagens usuais if
e &&
/ ||
não funcionarão para esses comandos específicos.
Por exemplo, no Linux GNU file
ainda sai com 0 se recebeu um arquivo não existente como argumento e find
não conseguiu localizar o usuário do arquivo especificado.
$ 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
Nesses casos, uma maneira potencial de lidarmos com a situação é lendo stderr
/ stdin
messages, por exemplo, aqueles que retornaram pelo comando file
ou analisam a saída do comando como em find
. Para esse propósito, case
declaração poderia ser usada.
$ 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 é um repost da minha própria resposta em questão relacionada em unix.stackexchange.com )