So fügen Sie eine Datei in ein Bash-Shell-Skript ein

121

Gibt es eine Möglichkeit, ein anderes Shell-Skript in ein Shell-Skript aufzunehmen, um auf dessen Funktionen zugreifen zu können?

Wie in PHP können Sie die includeDirektive mit anderen PHP-Dateien verwenden, um die darin enthaltenen Funktionen einfach durch Aufrufen des Funktionsnamens auszuführen.

Mechaflash
quelle
@ Troubadour danke für den Hinweis. Obwohl sich der Beitrag auf den sourceBefehl bezieht, stellt sich die Frage, wie der Speicherort einer sourceDatei ermittelt werden kann.
Mechaflash
1
"Grundfragen" sind der Katalysator des Stapelüberlaufs. Sie wissen, dass diese Site wie jede andere Site indiziert wird, und jetzt wird "Wie wird eine Datei in ein Bash-Shell-Skript aufgenommen?" Bei Google-Links angezeigt, um einen Stapelüberlauf zu erzielen und so den Site-Verkehr und die Gefährdung zu erhöhen. = D
Mechaflash
3
Du bist schlau! Vielen Dank für Ihre Großartigkeit!
Mechaflash
4
@Troubadour, es ist albern zu kommentieren, dass der Benutzer nach der Antwort hätte googeln sollen, wenn ich genau so auf die Seite gekommen bin. Zum Beispiel war diese spezielle Frage heute das beste Google-Ergebnis für "Bash-Include-Datei". Sollte ich diese Antwort übersprungen haben, um eine andere Lösung zu finden?
Lwitzel

Antworten:

192

Einfach in Ihr Skript einfügen:

source FILE

Oder

. FILE # POSIX compliant

$ LANG=C help source
source: 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.
Gilles Quenot
quelle
17
Beachten Sie, dass . ist POSIX-konform, während die Quelle nicht
Mathieu_Du
Aber hier ist die Quelle nicht genau die gleiche wie in der CSprache. Hier führt die Quelle das untergeordnete Skript im Hauptskript aus. Was ist, wenn ich nur eine bestimmte Funktion aus dem untergeordneten Skript aufrufen möchte?
Paresh Mayani
8
Verwechseln Sie nicht . script.shmit ./script.sh. Ich habe Stunden verloren, um herauszufinden, was los ist
Tihomir Mitkov
Während. ist POSIX-kompatibel, was bedeutet, dass es auf sh-, dash-, zsh- und anderen POSIX-Shells funktioniert. Es ist besser zu benutzen. Einige Shells haben ihre eigene, ähnliche, aber etwas andere Version von "source", die Ihre App beschädigen kann.
Jacob Korba
51

Die obigen Antworten sind korrekt, aber wenn das Skript in einem anderen Ordner ausgeführt wird, tritt ein Problem auf.

Zum Beispiel befinden sich die a.shund b.shin demselben Ordner, a include b mit . ./b.shto include.

Wenn Sie ein Skript aus dem Ordner ausführen, z. B. mit xx/xx/xx/a.sh, wird die Datei b.shnicht gefunden : ./b.sh: No such file or directory.

ich benutze

. $(dirname "$0")/b.sh
Fancyoung
quelle
33

Ja, verwenden Sie die Quelle oder die Kurzform, die nur lautet .:

. other_script.sh
Paul
quelle
3
Beachten Sie, dass die .Version shgenauso gut funktioniert wie Bash. Die "Quelle" funktioniert nur in Bash.
Sridhar Sarnobat
2

In meiner Situation musste ich Folgendes tun , um color.shaus demselben Verzeichnis aufzunehmen init.sh.

. ./color.sh

Nicht sicher warum ./und nicht color.shdirekt. Der Inhalt von color.shist wie folgt.

RED=`tput setaf 1`
GREEN=`tput setaf 2`
BLUE=`tput setaf 4`
BOLD=`tput bold`
RESET=`tput sgr0`

Die Verwendung von File color.shist kein Fehler, aber die Farbe wird nicht angezeigt. Ich habe dies getestet Ubuntu 18.04und die BashVersion ist:

GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)

Raf
quelle
Das gibt Ihnen nur die Datei in Ihrem aktuellen Arbeitsverzeichnis, nicht das Verzeichnis, in dem sie sich init.shbefindet (sie stimmen überein, wenn Sie sie überhaupt gestartet haben ./init.sh).
Ricab