Dans les shells POSIX, .
est une fonction intégrée spéciale, donc son échec provoque la fermeture du shell (dans certains shells comme bash
, cela n'est fait qu'en mode POSIX).
Ce qui constitue une erreur dépend du shell. Tous ne se terminent pas sur une erreur de syntaxe lors de l'analyse du fichier, mais la plupart se fermeraient lorsque le fichier source ne peut pas être trouvé ou ouvert. Je n'en connais aucun qui se terminerait si la dernière commande du fichier source renvoyait avec un état de sortie différent de zéro (sauf si l' errexit
option est bien sûr activée).
Voici faire:
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
Est un cas où vous souhaitez source le fichier s'il est là, et pas si ce n'est pas le cas (ou est vide ici avec -s
).
Autrement dit, il ne doit pas être considéré comme une erreur (erreur fatale dans les shells POSIX) si le fichier n'est pas là, ce fichier est considéré comme un fichier facultatif.
Ce serait toujours une erreur (fatale) si le fichier n'était pas lisible ou était un répertoire ou (dans certains shells) s'il y avait une erreur de syntaxe lors de son analyse, ce qui serait de vraies conditions d'erreur qui devraient être signalées.
Certains diront qu'il y a une condition de concurrence. Mais la seule chose que cela signifie serait que le shell se termine avec une erreur si le fichier est supprimé entre le [
et .
, mais je dirais qu'il est valide de considérer comme une erreur que ce fichier de chemin fixe disparaîtrait soudainement pendant que le script est fonctionnement.
D'autre part,
command . "$NVM_DIR/nvm.sh" 2> /dev/null
où command
¹ supprime l' attribut spécial de la .
commande (pour ne pas quitter le shell en cas d'erreur) ne fonctionnerait pas comme:
- il cacherait
.
les erreurs mais aussi les erreurs des commandes exécutées dans le fichier source
- cela masquerait également de vraies conditions d'erreur comme le fichier ayant les mauvaises autorisations.
D'autres syntaxes courantes (voir par exemple grep -r /etc/default /etc/init*
sur les systèmes Debian pour les scripts d'initialisation qui n'ont pas encore été convertis systemd
(où EnvironmentFile=-/etc/default/service
est utilisé à la place pour spécifier un fichier d'environnement facultatif)) incluent:
[ -e "$file" ] && . "$file"
Vérifiez le fichier qu'il est là, toujours source s'il est vide. Erreur toujours fatale si elle ne peut pas être ouverte (même si elle est là ou était là). Vous pouvez voir plus de variantes comme [ -f "$file" ]
(existe et est un fichier normal ), [ -r "$file" ]
(est lisible), ou des combinaisons de ceux-ci.
[ ! -e "$file" ] || . "$file"
Une version légèrement meilleure. Il est plus clair que le fichier inexistant est un cas OK. Cela signifie également que $?
reflétera l'état de sortie de la dernière commande exécutée $file
(dans le cas précédent, si vous obtenez 1
, vous ne savez pas si c'est parce qu'il $file
n'existait pas ou si cette commande a échoué).
command . "$file"
Attendez-vous à ce que le fichier soit là, mais ne quittez pas s'il ne peut pas être interprété.
[ ! -e "$file" ] || command . "$file"
Combinaison de ce qui précède: c'est OK si le fichier n'est pas là, et pour les shells POSIX, les échecs d'ouverture (ou d'analyse) du fichier sont signalés mais ne sont pas fatals (ce qui peut être plus souhaitable pour ~/.profile
).
¹ Remarque: Dans, zsh
cependant, vous ne pouvez pas utiliser command
comme ça, sauf en sh
émulation; noter que dans le shell Korn, source
est en fait un alias pour command .
, une variante non spéciale de.