Ist es in Ordnung, in Ubuntu und OS X zum Ausführen von Dateien in .bashrc „.“ statt der Quelle zu verwenden?

Ist es in Ordnung, in Ubuntu und OS X zum Ausführen von Dateien in .bashrc „.“ statt der Quelle zu verwenden?

OK, also sourceführt das Skript in der aktuellen Shell und .separat aus, wie inAusführen des Skripts mit „.“ und mit „source“zum Beispiel, aber insbesondere in meinem.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 das 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 ausprobiert und die oben genannten scheinen unter Ubuntu immer noch zu funktionieren (sie funktionieren also tatsächlich mit beiden sourceund ., das heißt, sie bieten mir die gewünschte Funktionalität in der Shell). Sollte ich das eine dem anderen vorziehen oder übersehe ich etwas?

Unter OS X verwende ich meine Quelle übrigens .bashrcvon meinem .bash_profile.

Antwort1

In sind und bashSynonyme . Wenn Sie sich den Quellcode oder die Datei ansehen , können Sie die gleiche interne Funktion sehen und verwenden :.sourcebashbuiltin/source.def.sourcesource_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.

Es ist jedoch sourcenicht POSIX-kompatibel. Wenn Ihr Skript also mit POSIX aufgerufen wird /bin/sh, sollten Sie .anstelle von verwenden source. Da POSIX die Shell nicht einschränkt, funktionieren alle Ihre obigen Skripte.

Ich persönlich verwende immer .anstelle von source. (Viele von mir geschriebene Skripte laufen unter cron).

Antwort2

Das istPOSIX-Definitionvon .dot:

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

Wenn die Datei kein enthält /<slash>, verwendet die Shell den durch angegebenen Suchpfad, $PATHum das Verzeichnis zu finden, das die Datei enthält. Anders als bei der normalen Befehlssuche .dot muss die vom Dienstprogramm gesuchte Datei jedochnichtausführbar sein. Wenn keine lesbare Datei gefunden wird, wird eine nicht interaktive Shell abgebrochen; eine interaktive Shell schreibt eine Diagnosemeldung in die Standardfehlerausgabe, aber dieser Zustand wird nicht als Syntaxfehler betrachtet.

In Anbetracht des oben Gesagten können Sie Ihr auch gleich komplett [ -f ./file ] && source ./filedurch ersetzen . ./file. Wenn die Datei nicht vorhanden ist, ist das Schlimmste, was passieren kann, dass Sie beim Anmelden eine Benachrichtigung erhalten – und das sind wahrscheinlich Informationen, die Sie haben möchten, denke ich.

Wenn Sie den Test lieber behalten möchten, haben Sie natürlich folgende Möglichkeiten:

test -f ./file && . $_

verwandte Informationen