Ist es in Ordnung, "." Dateien anstelle von Source ausführen - in .bashrc in Ubuntu und OS X?

11

OK, also sourceführt das Skript in der aktuellen Shell und .separat aus, wie im Ausführen des Skripts mit "." Und mit "source" beschrieben , aber speziell in meiner .bashrcDatei habe ich:

[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && source ~/.autojump/etc/profile.d/autojump.sh

Kann ich dies ersetzen durch:

[ -f ~/.bash_aliases ] && . ~/.bash_aliases
[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && . ~/.autojump/etc/profile.d/autojump.sh

Funktioniert das unter OS X - ist das das "POSIX" -Problem?

Ich habe es versucht und die oben genannten scheinen immer noch unter Ubuntu zu funktionieren (also funktionieren sie tatsächlich mit beiden sourceund .das heißt, sie geben mir die gewünschte Funktionalität in der Shell). Soll ich eins über das andere wählen oder fehlt mir etwas?

FWIW, unter OS X beziehe ich meine .bashrcvon meiner .bash_profile.

Michael Durrant
quelle
1
Wenn es sich um Sh-basierte Shells handelt, würde ich 'verwenden.' Aus Gründen der globalen Kompatibilität und wenn Sie 'csh'-basierte Shells verwenden, würde ich source verwenden.
Mdpc
2
Wo in dem verlinkten Beitrag sehen Sie, dass " sourcedas Skript in der aktuellen Shell und .separat ausgeführt wird"? Beide führen es in der aktuellen Shell aus. sonst hätte es keinen Sinn
Michael Mrozek

Antworten:

11

Dies ist die Definition von POSIX für .dot:

Die Shell muss Befehle aus der Datei in der aktuellen Umgebung ausführen.

Wenn die Datei kein enthält /<slash>, muss die Shell den angegebenen Suchpfad verwenden $PATH, um das Verzeichnis zu finden, das die Datei enthält. Im Gegensatz zur normalen Befehlssuche muss die vom .dot Dienstprogramm gesuchte Datei jedoch nicht ausführbar sein. Wird keine lesbare Datei gefunden, wird eine nicht interaktive Shell abgebrochen. Eine interaktive Shell muss eine Diagnosemeldung in den Standardfehler schreiben, diese Bedingung wird jedoch nicht als Syntaxfehler betrachtet.

Unter Berücksichtigung der oben, könnte man genauso gut ersetzen Sie einfach Ihre [ -f ./file ] && source ./filemit . ./fileganz. Wenn die Datei nicht vorhanden ist, erhalten Sie beim Anmelden eine Benachrichtigung. Dies sind wahrscheinlich Informationen, die Sie haben möchten, denke ich.

Wenn Sie den Test lieber behalten möchten, können Sie natürlich Folgendes tun:

test -f ./file && . $_
mikeserv
quelle
2
Oh, Leute wissen $_, das gefällt mir. :)
Andreas Wiese
@AndreasWiese - jeder sollte - es ist einer von nur 7 speziellen Parametern, die von POSIX definiert werden.
Mikesserv
+1 Ich habe den test -f /.file && . $_hier gezeigten Ansatz verwendet
Michael Durrant
6
@mikeserv Nein, $_ist nicht von POSIX standardisiert. Die 8 speziellen Parameter sind $@, $*, $#, $$, $!, $?, $-und $0. $_wird ausdrücklich weggelassen . Ihr falscher Kommentar hat eine Frage ausgelöst .
Gilles 'SO - hör auf böse zu sein'
19

In bash, .und sourcesind Synonyme. Wenn Sie sich den bashQuellcode und die Datei builtin/source.defansehen, können Sie dieselbe interne Funktion sehen .und sourceverwenden source_builtin:

$BUILTIN source
$FUNCTION source_builtin
$SHORT_DOC source filename [arguments]
Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
$END

$BUILTIN .
$DOCNAME dot
$FUNCTION source_builtin
$SHORT_DOC . filename [arguments]
Execute commands from a file in the current shell.

sourceIst aber nicht POSIX-kompatibel. Wenn Ihr Skript mit POSIX aufgerufen wird /bin/sh, sollten Sie .stattdessen POSIX verwenden source. Da POSIX die Shell nicht einschränkt, funktionieren alle oben genannten Skripte.

Persönlich benutze ich immer .statt source. (Viele Skripte, die ich geschrieben habe, laufen unter cron).

cuonglm
quelle
Wenn alle Dinge gleich sind, verwenden Sie "Quelle" anstelle von "." aus einem Grund: versuche nach "." zu suchen / grep. Ausdrücke in einem großen Skript. Es ist ein Albtraum.
Abonet
Obwohl diese Antwort erklärt, warum die Verwendung .normalerweise "besser" ist als die Verwendung source, wie @abonet sagt, sourceist die Suche viel einfacher. Da Punkte in vielen Sprachen Satzzeichen sind, kann das Auge sie leicht überspringen. Deshalb benutze ich lieber source.
Joe