it-swarm.com.de

Wie kann ich eine Funktion über ein Skript in der Befehlszeile ausführen?

Ich habe ein Skript, das einige Funktionen hat.

Kann ich eine Funktion direkt von der Kommandozeile aus ausführen?

Etwas wie das?

myScript.sh func()
85
AAaa

Wenn das Skript nur die Funktionen definiert und nichts anderes tut, können Sie das Skript zuerst im Kontext der aktuellen Shell mit dem Befehl source oder . ausführen und dann die Funktion aufrufen. Weitere Informationen finden Sie unter help source.

45
Sven Marnach

Während die anderen Antworten richtig sind, können Sie sicherlich noch etwas anderes tun: Wenn Sie Zugriff auf das Bash-Skript haben, können Sie es ändern und am Ende einfach den speziellen Parameter "[email protected]" einfügen, der sich zu den Argumenten des Befehls erweitert Zeile, die Sie angeben, und da es "allein" ist, versucht die Shell, sie wörtlich zu nennen. und hier könnten Sie den Funktionsnamen als erstes Argument angeben. Beispiel: 

$ cat test.sh
testA() {
  echo "TEST A $1";
}

testB() {
  echo "TEST B $2";
}

"[email protected]"


$ bash test.sh
$ bash test.sh testA
TEST A 
$ bash test.sh testA arg1 arg2
TEST A arg1
$ bash test.sh testB arg1 arg2
TEST B arg2

Bei Polnisch können Sie zunächst überprüfen, ob der Befehl vorhanden ist und eine Funktion ist:

# Check if the function exists (bash specific)
if declare -f "$1" > /dev/null
then
  # call arguments verbatim
  "[email protected]"
else
  # Show a helpful error
  echo "'$1' is not a known function name" >&2
  exit 1
fi
169
sdaau

Der folgende Befehl registriert die Funktion zuerst im Kontext und ruft sie dann auf:

. ./myScript.sh && function_name
22
TimonWang

Kurz, nein.

Sie können alle Funktionen des Skripts mit source (help source für Details) in Ihre Umgebung importieren. Anschließend können Sie sie aufrufen. Dies hat auch die Wirkung, das Skript auszuführen, also seien Sie vorsichtig.

Es gibt keine Möglichkeit, eine Funktion aus einem Shell-Skript aufzurufen, als wäre es eine gemeinsam genutzte Bibliothek.

11
Sorpigal

Ich habe eine Situation, in der ich eine Funktion aus dem Bash-Skript benötige, die vorher nicht ausgeführt werden darf (zB von source) und das Problem mit @$ Ist, dass myScript.sh dann anscheinend zweimal ausgeführt wird ... also ich bin auf die idee gekommen, die funktion mit sed rauszubringen:

sed -n "/^func ()/,/^}/p" myScript.sh

Und um es zu dem Zeitpunkt auszuführen, an dem ich es brauche, lege ich es in eine Datei und verwende source:

sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh

1
vchrizz

Edit: WARNING - scheint nicht in allen Fällen zu funktionieren, funktioniert aber bei vielen öffentlichen Skripten gut.

Wenn Sie ein bash-Skript mit dem Namen "control" haben, haben Sie eine Funktion namens "build":

function build() { 
  ... 
}

Dann können Sie es so aufrufen (aus dem Verzeichnis, in dem es sich befindet):

./control build

Wenn es sich in einem anderen Ordner befindet, würde dies Folgendes bewirken:

another_folder/control build

Wenn Ihre Datei "control.sh" heißt, würde die Funktion demnach folgendermaßen aufgerufen werden:

./control.sh build
0
Arturas M