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?

sześćdziesiąt stóp
źródło

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.

John T.
źródło
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.

Debuger
źródło
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    
$
Mike Wodarczyk
źródło
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
0

Operator kropkowy lub sourcewbudowany bashjest analogiczny do importinstrukcji w Javie.

Możesz przeczytać więcej o operatorze kropkowym lub sourcewbudowanym .

jedenaście81
źródło