Wie man Bash-Funktionen aufruft


28

Vielleicht schaue ich das falsch an .. Aber hier habe ich was ich versuche zu tun. Mache den größten Teil meiner Arbeit mit Java, aber wechsele einfach zu einer Unix (Bash) -Umgebung. Ich mache das:

[~/Desktop/bashPlay]% cat myFunc
#!/bin/bash

ls2(){
        echo "Hello World"
}

ls3(){
        echo "Testing"
}

echo "this is a test"   
ls2 # this calls a function

[~/Desktop/bashPlay]% myFunc
this is a test
Hello World

Ich habe aber zwei Funktionen in meiner Datei und möchte sie getrennt von der Kommandozeile aufrufen können. Dh myFunc.ls2()oder auch nur ls2. Ich weiß, dass ich die Funktionen zu meiner .bashrcDatei hinzufügen kann, aber gibt es eine andere Möglichkeit, diese Funktionen auszuführen, ohne sie zu meiner hinzuzufügen .bashrc?

Antworten:


25

Eine Möglichkeit, dies zu tun, besteht darin, etwas mehr zu tippen, und zwar über den sourceBefehl. Um eine Funktion von myFunc aus aufzurufen, können Sie diese verwenden source myFunc; ls2und Hello World ausgeben.

So habe ich zum Beispiel eine Datei mit dem Namen say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

Jetzt möchte ich seine talk()Funktion von der Kommandozeile aus aufrufen :

[john @ awesome ~] $ source say.sh; sich unterhalten
Hallo!

So rufen Sie es aus einem anderen Bash-Skript auf:

#!/bin/bash
source say.sh
talk

Sie können jedes Skript auch in ein separates Skript einfügen und sie in ein Verzeichnis einfügen, das sich in Ihrer PATH-Variablen befindet.

In einem Skript mit dem Namen würden helloSie beispielsweise Folgendes haben:

#!/bin/bash
echo "Hello World"

Legen Sie es nun in eines der Verzeichnisse in Ihrem PATH, das Sie durch Ausführen anzeigen können echo $PATH. Sie können Ihrem PATH ein weiteres Verzeichnis hinzufügen, wenn Sie ein vorhandenes verwenden möchten. Sobald Sie die Datei dort kopiert haben, können Sie sie mit ausführbar machen chmod +x filename.


3
Um ganz klar zu sein: Sie müssen die Datei nur einmal pro Skript- oder Shell-Start erzeugen. Danach können Sie die Funktion so oft aufrufen, wie Sie möchten, ohne die Quelldatei erneut zu referenzieren.
Bis auf weiteres angehalten.

5

Ein anderer Ansatz wäre, ein Skript mit dem Namen functions.sh(beispielsweise im ~/binVerzeichnis) zu erstellen .

In diesem Skript fügen Sie alle Ihre persönlichen Funktionsdefinitionen hinzu (sagen wir, jedes Mal, wenn Sie eine Funktion hinzufügen, fügen Sie sie dieser Datei hinzu ...).

Zum Schluss müssen Sie nur noch die source ~/bin/functions.shZeile in Ihre .bashrcDatei einfügen. Auf diese Weise können Sie sie über die Befehlszeile aufrufen, .bashrcbleiben sauber und haben einen bestimmten Platz für Ihre persönlichen Funktionen.


5

Wenn Sie wie ich sind, möchten Sie Ihre Umgebung nicht mit Funktionen überladen. Sie haben auch eine Gruppe von Funktionen, die hinsichtlich ihrer Funktion zusammengehören. Daher ist es sinnvoll, sie in derselben Skriptdatei zu speichern. (Ich weiß, dass ein Ordner mit mehreren Dateien den gleichen Zweck erfüllen kann). Hier ist eine mögliche Lösung, mit der Sie eine bestimmte Funktion im Skript aufrufen können:

$ cat functions.sh    
#!/bin/bash

ls2() {
        echo "Hello World"
}

ls3() {
        echo "Testing $*"
}

# the next line calls the function passed as the first parameter to the script.
# the remaining script arguments can be passed to this function.

$1 $2 $3 $4 $5 

$ ./functions.sh ls2    
Hello World   
$ ./functions.sh ls3    
Testing     
$ ./functions.sh ls3 first_arg    
Testing first_arg    
$

Ich mag dies sehr viel mehr, als sourceweil es zwei Funktionen mit dem gleichen Namen in zwei verschiedenen sh-Dateien verarbeiten kann. Ich verfeinerte es eine beliebige Anzahl von Parametern zu behandeln durch den Austausch $1 $2 $3 $4 $5mitFUNC_CALL=$1; shift; $FUNC_CALL "$@"
Chuck Wilbur

@ChuckWilbur: Warum durch Reifen springen? Ändern Sie einfach die letzte Zeile in "$@". PS Ihr Ansatz ist eigentlich falsch; Der letzte Teil sollte sein "$FUNC_CALL" "$@"  (dh  $FUNC_CALLsollte in Anführungszeichen stehen).
Scott

Was ist "$FUNC_CALL"?
Strg-Alt-Delor

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.