Ausführen von Funktionen, die außerhalb meines Shell-Skripts deklariert wurden

389
Diego S.

Zur Zeit verfügt mein ZSH über einige Funktionen, zum Beispiel:

% declare -f ... a lot of shell functions appears here. 

Ich schreibe gerade ein Shell-Skript, das eine bestimmte Funktion aus dieser Liste prompt_diraufruft ( vom Powerlevel9k-Thema für Oh-My-Zsh).

Mein Skript lautet:

#!/bin/zsh echo_prompt_segment(){ # bunch of source-code here }  zsh_oddeven_dir(){ prompt_dir echo }  zsh_oddeven_dir 

Problem ist, dass mein Skript nicht auf diese Funktionen zugreifen kann:

% ./oddeven-pwd.sh zsh_oddeven_dir:1: command not found: prompt_dir 

Wenn ich declare -fdas Skript ausführe, gibt es nur die beiden Funktionen, die sich in meinem Skript befinden:

% ./oddeven-pwd.sh  echo_prompt_segment () {  } zsh_oddeven_dir () { declare -f } 

Kann ich auf die Funktionen zugreifen und diese ausführen, die über meinem Skript deklariert wurden? Wenn das so ist, wie?

1
Bitte fügen Sie dem Fragenkörper keine Lösung hinzu. Sie können [Antwort auf Ihre eigene Frage] (https://superuser.com/help/self-answer) im Antwortfeld eingeben. Der Text Ihrer Lösung ist weiterhin verfügbar [hier] (https://superuser.com/revisions/1328518/2). Sie müssen also nicht erneut eingeben. Das Hinzufügen von "Gelöst" zum Titel ist nicht das, was wir mit Super User tun. Das Annehmen einer Antwort reicht aus, um anzuzeigen, dass das Problem gelöst ist. Kamil Maciorowski vor 5 Jahren 0

1 Antwort auf die Frage

1
AFH

Da Skripts standardmäßig in Subshells ausgeführt werden, handelt es sich bei der gewünschten Funktion um exportierte Funktionen, die in bash, jedoch nicht in verfügbar sind zsh.

In bashder Standardposition ist das Hinzufügen von Benutzerfunktionen enthalten ~/.bashrc, dies wird jedoch nicht ausgeführt, es bashsei denn, es ist interaktiv (insbesondere nicht in einer Subshell, die ein Skript ausführt), die exportierte Funktionen überwinden.

Was in dieser Antwort zu funktionieren scheint, ist das Einfügen Ihrer Funktionsdeklarationen ~/.zshenv, die standardmäßig bei jedem Start ausgeführt werden, interaktiv oder nicht.

Sie sollten sich auch die vorherige (akzeptierte) Antwort ansehen, die unter anderem den Grund erläutert, aus dem zshexportierte Funktionen nicht unterstützt werden.

Nun, die vorher akzeptierte Antwort hat mich veranlasst, das eigentliche Problem tatsächlich zu sehen: Unabhängig von `bash 'oder` zsh' (eigentlich waren entweder mein Skript und die Funktionsdeklaration in 'zsh'), wenn ich mein Skript ausführte, läuft es in einem separierter Shell-Prozess, so dass Funktionsreferenzen verloren gehen. Ich habe das Problem gelöst, indem ich `source myscript.sh` verwendet habe, anstatt es normal auszuführen. Diego S. vor 5 Jahren 0
Sorry, ich hätte darauf hinweisen sollen, dass Skripts standardmäßig in Subshells laufen. Ich bin so an die Idee gewöhnt, dass ich vergessen habe, dass sich nicht jeder dessen bewusst ist. Ich habe meine Antwort erweitert, um dies zu erklären, mit einigen hervorstechenden Punkten, wie Muscheln initialisiert werden AFH vor 5 Jahren 0