Ersatz für Quelle in sh

71

Ich muss die Umgebungsvariablen festlegen, normalerweise tun wir dies durch

source script.sh

Aber jetzt automatisiere ich es während des Startvorgangs und es sieht so aus, als würde der Root standardmäßig mit shShell booten . Wie beziehe ich dieses Skript ein sh?

vkris
quelle
Ich verstehe nicht, auf welche Weise Sie die Quelle "ersetzen" müssen, da es so klingt, als würden Sie nach der Quelle fragen.
Sorpigal
2
Ich meinte den Ersatz für den Quellbefehl in der 'sh'-Shell. In einfachen Worten, Quelle: bash :: ?? : sh
vkris

Antworten:

99

Der Punktbefehl ' .' entspricht dem sourceBefehl C Shell (und Bash) . Es wird von POSIX spezifiziert (siehe dot) und von den Bourne- und Korn-Muscheln unterstützt (und zsh, glaube ich).

. somefile

Beachten Sie, dass die Shell mit nach der Datei sucht $PATH, die Datei jedoch nur lesbar und nicht ausführbar sein muss.

Wie in den Kommentaren unten angegeben, können Sie natürlich einen relativen oder absoluten Pfadnamen für die Datei angeben. Nach Namen, die einen Schrägstrich enthalten, wird nicht gesucht $PATH. Damit:

. /some/where/somefile
. some/where/somefile
. ./somefile

könnten alle zu finden , verwendet werden , somefilewenn es in den drei verschiedenen vorgegebenen Stellen bestanden (wenn Sie ersetzen könnte .mit ls -lund eine Datei aufgeführt).

Pedanten der Welt vereinen sich! Ja, wenn das aktuelle Verzeichnis ist das Stammverzeichnis, dann /some/where/somefileund ./some/where/somefileauf die gleiche Datei verweisen würde - mit dem gleichen realen Weg - auch ohne Links, symbolische oder harter, eine Rolle zu spielen (und würde so ../../some/where/somefile).

Jonathan Leffler
quelle
1
Was ist, wenn ich den gesamten Weg gebe? mögen . / usr / local / xyz / script? Funktioniert das?
Vkris
Natürlich kann ein absoluter oder relativer Pfad für den Dateinamen verwendet werden; Die PATH-Suche erfolgt nur, wenn der Name wie bei jedem anderen Skript keinen Schrägstrich enthält.
Jonathan Leffler
Kein Schrägstrich am Anfang des Namens, ich meine, Sie meinen.
Sorpigal
2
@Sorpigal: nein; Wenn Sie eingeben . somewhere/something, muss ein Unterverzeichnis vorhanden sein, ./somewheredas eine Datei enthält, somethingdamit der Befehl gefunden werden kann.
Jonathan Leffler
6

tl; dr Mit sh(im Gegensatz zu bash) muss das Argument einen Schrägstrich enthalten: source ./script.shnicht nur source script.sh. Es script.shsei denn , in gefunden werden PATH.

Der .Befehl Dot ( ) ist in bashund vorhanden sh. Zusätzlich bashAliase es als source. Aus dem bashHandbuch:

https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-source

Quelle

source filename

Ein Synonym für .(siehe Bourne Shell Builtins).

https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-_002e

. (eine Periode, ein Zeitabstand)

. filename [arguments]

Lesen und Ausführen von Befehlen aus dem filenameArgument im aktuellen Shell-Kontext. Wenn filenamekein Schrägstrich enthalten ist, wird die PATHVariable verwendet, um den Dateinamen zu finden. Wenn sich Bash nicht im POSIX-Modus befindet, wird das aktuelle Verzeichnis durchsucht, wenn filenamees nicht gefunden wird $PATH.

Von POSIX :

Wenn filekein a enthalten ist /, verwendet die Shell den angegebenen Suchpfad PATH, um das Verzeichnis mit der Datei zu finden. Im Gegensatz zur normalen Befehlssuche muss die vom Dienstprogramm dot gesuchte Datei jedoch nicht ausführbar sein.

x-yuri
quelle