Jak wywołać funkcje bash


28

Może patrzę na to w niewłaściwy sposób ... Ale tutaj staram się to zrobić. Większość pracy wykonuję w Javie, ale po prostu przełączyłem się na środowisko uniksowe (bash). Robię to:

[~/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

Ale w moim pliku są dwie funkcje i chcę móc je wywoływać niezależnie od wiersza poleceń. Tj .: myFunc.ls2()a nawet po prostu ls2. Wiem, że mogę dodać funkcje do mojego .bashrcpliku, ale czy jest jakiś inny sposób na wykonanie tych funkcji bez dodawania ich do mojego .bashrc?

Odpowiedzi:


25

Jednym ze sposobów na to, który wymaga nieco więcej pisania, jest sourcepolecenie. Aby wywołać funkcję z myFunc, możesz jej użyć source myFunc; ls2i wyświetli się Hello World.

Na przykład mam plik o nazwie say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

teraz chcę wywołać jego talk()funkcję z wiersza poleceń:

[John @ awesome ~] $ source say.sh; rozmowa
cześć!

aby wywołać go z innego skryptu bash:

#!/bin/bash
source say.sh
talk

Możesz również umieścić każdy w osobnym skrypcie i dodać je do katalogu, który znajduje się w zmiennej PATH.

na przykład w jednym skrypcie o nazwie hellomiałbyś:

#!/bin/bash
echo "Hello World"

teraz umieść go w jednym z katalogów w ŚCIEŻCE, które możesz wyświetlić, uruchamiając echo $PATH. Możesz dodać kolejny katalog do PATH, jeśli chcesz lub użyć już istniejącego. Po skopiowaniu pliku należy go wykonać za pomocą chmod +x filename.


3
Żeby było jasne: plik należy tylko raz pobrać na skrypt podczas uruchamiania skryptu lub powłoki. Możesz wywołać tę funkcję tyle razy, ile chcesz, bez odwoływania się do pliku źródłowego.
Wstrzymano do odwołania.

5

Innym podejściem byłoby utworzenie skryptu o nazwie functions.sh( ~/binna przykład w katalogu).

W tym skrypcie dodajesz wszystkie osobiste definicje funkcji (powiedzmy za każdym razem, gdy dodajesz funkcję, dodajesz ją do tego pliku ...)

Na koniec musisz po prostu dodać source ~/bin/functions.shlinię do swojego .bashrcpliku. W ten sposób będziesz mógł wywoływać je z wiersza poleceń, .bashrcpozostaniesz czysty i będziesz mieć określone miejsce na swoje osobiste funkcje.


5

Jeśli jesteś podobny do mnie, nie chcesz zaśmiecać swojego środowiska funkcjami. Masz również grupę funkcji, które należą do siebie pod względem tego, co robią, więc umieszczenie ich w tym samym pliku skryptu ma sens. (Wiem, że folder z wieloma plikami może służyć temu samemu celowi). Oto możliwe rozwiązanie, które pozwala wywołać określoną funkcję w skrypcie:

$ 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    
$

Podoba mi się to bardziej, sourceponieważ może obsłużyć dwie funkcje o tej samej nazwie w dwóch różnych plikach sh. I rafinowany go obsługiwać dowolną liczbę parametrów, zastępując $1 $2 $3 $4 $5zFUNC_CALL=$1; shift; $FUNC_CALL "$@"
Chuck Wilbur

@ChuckWilbur: Po co skakać przez obręcze? Po prostu zmień ostatnią linię na "$@". PS Twoje podejście jest w rzeczywistości złe; ostatnia część powinna być "$FUNC_CALL" "$@"  (tj.  $FUNC_CALLpowinna być w cudzysłowie).
Scott,

Co to jest "$FUNC_CALL"?
ctrl-alt-delor

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.