2017-10-21 62 views
0

Pour rendre les choses claires, je voudrais court mon script bash:bash "-e" puzzler: fichier script terminé de façon inattendue

#!/bin/bash -e 

p_time=$(expr 0 - 0) 
echo ? 
echo "process time(sec) is: " ${p_time} 

Le fichier se terminerait avant "echo?", Mais si je change « P_TIME = $ (expr 0 - 0) "to" p_time = $ (expr 3 - 0) ", le fichier se terminerait correctement.
Cependant, si j'ai supprimé "-e" dans la première phrase, le fichier s'est également terminé correctement.
Pourquoi cela se produirait-il?

+1

C'est l'une des raisons pour lesquelles de nombreuses personnes recommandent de ne pas utiliser l'option '-e'; un code de sortie différent de zéro n'indique pas toujours une * erreur *. – chepner

+0

Si vous avez des questions sur la justesse et la prévisibilité du comportement de 'set -e', pensez à faire les exercices dans [BashFAQ # 105] (http://mywiki.wooledge.org/BashFAQ/105), ou revoir le tableau démontrant les incompatibilités entre les implémentations de différents shells à https://www.in-ulm.de/~mascheck/various/set-e/ –

+1

BTW, en aparté, 'expr' est une relique des années 1970 et devrait ne pas être utilisé dans les scripts modernes. 'p_time = $ ((0 - 0))' est garanti pour fonctionner avec tous les shell conformes à la norme POSIX.2 de 1991, et est * loin * plus efficace (car il évite 'fork()' sur un sous-processus). –

Répondre

2

bash -e signifie Exit immediately if a command exits with a non-zero status.

Le résultat de 0 - 0 est 0, de sorte que le code de sortie de expr 0 - 0 est 1 et Bash quittera immédiatement. Si vous supprimez -e, Bash ignorera le code de sortie de expr 0 - 0 et exécutera toutes les commandes de votre script.