Bei POSIX-Shells .
handelt es sich um eine spezielle Funktion, bei deren Fehlschlagen die Shell beendet wird (bei einigen Shells bash
wird dies nur im POSIX-Modus ausgeführt).
Was als Fehler zu qualifizieren ist, hängt von der Shell ab. Nicht alle werden bei einem Syntaxfehler beim Parsen der Datei beendet, die meisten werden jedoch beendet, wenn die Quelldatei nicht gefunden oder geöffnet werden kann. Ich kenne keine, die beendet würden, wenn der letzte Befehl in der Quelldatei mit einem Beendigungsstatus ungleich Null zurückgegeben würde (es sei denn, die errexit
Option ist natürlich aktiviert).
Hier machen:
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
Ist ein Fall, in dem Sie die Datei als Quelle angeben möchten, wenn sie vorhanden ist, und nicht, wenn sie nicht vorhanden ist (oder hier mit leer ist -s
).
Das heißt, es sollte nicht als Fehler betrachtet werden (schwerwiegender Fehler in POSIX-Shells). Wenn die Datei nicht vorhanden ist, wird diese Datei als optionale Datei betrachtet.
Es wäre immer noch ein (schwerwiegender) Fehler, wenn die Datei nicht lesbar oder ein Verzeichnis wäre, oder (in einigen Shells), wenn beim Parsen ein Syntaxfehler aufgetreten wäre, der echte Fehlerbedingungen darstellen würde, die gemeldet werden sollten.
Einige würden argumentieren, dass es eine Rennbedingung gibt. Das einzige, was dies bedeutet, ist, dass die Shell mit einem Fehler beendet wird, wenn die Datei zwischen [
und entfernt wird.
wird. Ich würde jedoch argumentieren, dass es sich um einen Fehler handelt, bei dem diese Datei mit festem Pfad plötzlich verschwindet, während das Skript ausgeführt wird Laufen.
Auf der anderen Seite,
command . "$NVM_DIR/nvm.sh" 2> /dev/null
Wobei command
¹ das spezielle Attribut für den .
Befehl entfernt (damit die Shell bei einem Fehler nicht beendet wird), funktioniert nicht wie folgt:
- es würde
.
die Fehler verbergen , aber auch die Fehler der Befehle, die in der Quelldatei ausgeführt werden
- Es würde auch echte Fehlerbedingungen verbergen, wie die Datei mit den falschen Berechtigungen.
Andere gebräuchliche Syntaxen (siehe zum Beispiel grep -r /etc/default /etc/init*
auf Debian-Systemen für die Init-Skripte, die noch nicht konvertiert wurden systemd
(wobei EnvironmentFile=-/etc/default/service
stattdessen eine optionale Umgebungsdatei angegeben wird)):
[ -e "$file" ] && . "$file"
Überprüfen Sie die Datei, die sie enthält, und geben Sie sie weiterhin aus, wenn sie leer ist. Immer noch schwerwiegender Fehler, wenn es nicht geöffnet werden kann (obwohl es da ist oder war). Möglicherweise sehen Sie weitere Varianten wie [ -f "$file" ]
(existiert und ist eine reguläre Datei), [ -r "$file" ]
(ist lesbar) oder Kombinationen davon.
[ ! -e "$file" ] || . "$file"
Eine etwas bessere Version. Verdeutlicht, dass es sich bei der nicht vorhandenen Datei um einen OK-Fall handelt. Das bedeutet $?
auch, dass der Exit-Status des zuletzt ausgeführten Befehls angezeigt wird $file
(im vorherigen Fall 1
wissen Sie nicht, ob der $file
Befehl nicht vorhanden war oder fehlgeschlagen ist).
command . "$file"
Erwarten Sie, dass die Datei dort ist, aber beenden Sie sie nicht, wenn sie nicht interpretiert werden kann.
[ ! -e "$file" ] || command . "$file"
Kombination der oben genannten Punkte: Wenn die Datei nicht vorhanden ist, ist dies in Ordnung. Bei POSIX-Shells werden Fehler beim Öffnen (oder Parsen) der Datei gemeldet, die jedoch nicht schwerwiegend sind (was für möglicherweise wünschenswerter ist ~/.profile
).
¹ Hinweis: In zsh
können Sie dies jedoch nur command
in der sh
Emulation verwenden. Beachten Sie, dass in der Korn-Shell source
tatsächlich ein Alias für command .
eine nicht spezielle Variante von.