Ich habe bash
in meiner ~/.bashrc
Datei eine Funktion definiert . Dies ermöglicht mir die Verwendung in Shell-Terminals. Es scheint jedoch nicht zu existieren, wenn ich es aus einem Skript heraus aufrufe.
Wie kann ich eine bash
Funktion definieren , die auch von Skripten verwendet wird?
bash
shell-script
function
Onturenio
quelle
quelle
/bin/sh
in der Shebang-Linie?Antworten:
~/.bash_profile
und~/.bashrc
werden nicht von Skripten gelesen, und Funktionen werden standardmäßig nicht exportiert. Dazu können Sieexport -f
wie folgt vorgehen:export -f foo
könnte auch aufgerufen werden~/.bash_profile
, um diese Funktion nach der Anmeldung für Skripte verfügbar zu machen. Seien Sie gewarnt, dassexport -f
es nicht tragbar ist.Eine bessere Lösung wäre es, die Datei, die die Funktion enthält, mit zu beschaffen
. file
. Dies ist viel portabler und setzt nicht voraus, dass Ihre Umgebung auf eine bestimmte Weise eingerichtet wird.quelle
function myFunction { ... }
in deklarieren~/.bash_profile
und loslegen?export
Lösung scheint jedoch ordnungsgemäß zu funktionieren. Vielen Dank.foo
Funktion von einer anderen benötigt.file
2) Sie können den Inhalt davon besser kontrollieren,file
als sicherzustellen, dass die aufrufende Shell hat sichfoo
vor dem Aufruf Ihres Skripts nicht geändert . Sie können beispielsweise Sicherheitsüberprüfungen hinzufügenfile
, um sicherzustellen, dass keine Manipulation vorliegt. (nicht einfach, aber möglich). (na ja, du könntest auch die definierte foo-Funktion überprüfen ... aber du bekommst meine Drift ^^ Ich denke, die Methode 2 ist sauberer.) 3)file
wird nur das enthalten, was benötigt wird, nicht mehr..bashrc
wird nur von interaktiven Shells gelesen. (Eigentlich ist das eine Vereinfachung: Bash ist in dieser Hinsicht eigenartig. Bash liest nicht,.bashrc
ob es sich um eine interaktive oder nicht interaktive Anmeldeshell handelt. Und es gibt auch eine Ausnahme: Wenn der übergeordnete Prozess von Bashrshd
oder istsshd
, dann liest Bash.bashrc
, ob es interaktiv ist oder nicht.)Platzieren Sie Ihre Funktionsdefinitionen in einer Datei an einem bekannten Ort und verwenden Sie die
.
(auch geschriebenesource
) Funktion, um diese Datei in ein Skript aufzunehmen.Wenn Sie möchten, können Sie die Autoload-Funktion von ksh verwenden. Fügen Sie jede Funktionsdefinition in eine Datei mit demselben Namen wie die Funktion ein. Listen Sie die Verzeichnisse mit den Funktionsdefinitionen in der
FPATH
Variablen auf (eine durch Doppelpunkte getrennte Liste von Verzeichnissen). Hier ist eine grobe Annäherung an kshs,autoload
die die Funktion tatsächlich sofort statt nach Bedarf lädt:quelle
Haben Sie benötigen eine Funktion? Wenn nicht, ziehen Sie in Betracht, die Logik in ein separates, eigenständiges Bash-Skript in Ihrem zu ziehen
$PATH
. Zum Beispiel hatte ich das in meinem~/.bashrc
:~/bin
ist in meinem$PATH
, also habe ich~/bin/wanip
mit folgendem inhalt erstellt:Und lief
chmod 0755 ~/bin/wanip
, um es ausführbar zu machen. Jetzt kann ichwanip
von anderen Skripten ausführen .Ich mag es,
wanip
ein eigenständiges Bash-Skript zu haben. Es erinnert mich daran, dass ich möchte, dass diese Logik allgemein verfügbar ist (außer in meiner aktuellen interaktiven Bash-Sitzung). Das Skript kapselt die Logik und Dokumentation dafür.quelle