Mam skrypt, który ma kilka funkcji.
Czy mogę uruchomić jedną z funkcji bezpośrednio z wiersza poleceń?
Coś takiego?
myScript.sh func()
Jeśli skrypt definiuje tylko funkcje i nie robi nic więcej, możesz najpierw wykonać skrypt w kontekście bieżącej powłoki za pomocą polecenia source
lub, .
a następnie po prostu wywołać funkcję. Zobacz, help source
aby uzyskać więcej informacji.
exit
w swojej funkcji, zamknie ona terminal po wykonaniu funkcji. Czy można to obejść? @SvenMarnachbash
) iexit
zakończy ona tylko podpowłokę, ale nie zakończy swojego terminala.Cóż, podczas gdy inne odpowiedzi są prawidłowe - z pewnością możesz zrobić coś innego: jeśli masz dostęp do skryptu bash, możesz go zmodyfikować i po prostu umieścić na końcu specjalny parametr
"$@"
- który rozwinie się do argumentów wiersza poleceń określasz, a ponieważ jest „sam”, powłoka będzie próbowała nazywać je dosłownie; i tutaj możesz określić nazwę funkcji jako pierwszy argument. Przykład:W przypadku języka polskiego możesz najpierw sprawdzić, czy polecenie istnieje i jest funkcją:
źródło
"$@"
w większości przypadków.$@
w niektórych przypadkach nie jest bezpieczne.bash test.sh testA testB
?[ ! -z "$1" ]
przeciwnym razie source podniesie instrukcję else w niektórychNastępujące polecenie najpierw rejestruje funkcję w kontekście, a następnie ją wywołuje:
źródło
Krótko mówiąc, nie.
Możesz zaimportować wszystkie funkcje skryptu do swojego środowiska za pomocą
source
(help source
aby uzyskać szczegółowe informacje), co pozwoli ci na ich wywołanie. Ma to również wpływ na wykonanie skryptu, więc uważaj.Nie ma możliwości wywołania funkcji ze skryptu powłoki tak, jakby była to biblioteka współdzielona.
źródło
Za pomocą
case
Ten skrypt uruchomi funkcje fun1 i fun2, ale jeśli uruchomisz go z opcją fun1 lub fun2, uruchomi tylko daną funkcję z argumentami (jeśli są podane) i zakończy działanie. Stosowanie
źródło
Edycja: OSTRZEŻENIE - wydaje się, że to nie działa we wszystkich przypadkach, ale działa dobrze w wielu publicznych skryptach.
Jeśli masz skrypt basha o nazwie „control”, a wewnątrz niego znajduje się funkcja o nazwie „build”:
Następnie możesz nazwać to w ten sposób (z katalogu, w którym się znajduje):
Jeśli znajduje się w innym folderze, oznaczałoby to:
Jeśli twój plik nazywa się „control.sh”, to odpowiednio sprawi, że funkcja będzie wywoływana w następujący sposób:
źródło
. ./control.sh && build
Mam sytuację, w której potrzebuję funkcji ze skryptu basha, której wcześniej nie można wykonać (np. Przez
source
) i problem@$
polega na tym, że myScript.sh jest wtedy uruchamiany dwukrotnie, wydaje się ... Więc wpadłem na pomysł aby uzyskać funkcję za pomocą seda:sed -n "/^func ()/,/^}/p" myScript.sh
Aby wykonać to w momencie, w którym go potrzebuję, umieszczam go w pliku i używam
source
:sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh
źródło
możesz wywołać funkcję z argumentu wiersza poleceń, jak poniżej
Po zakończeniu funkcji wstaw $ 1, aby zaakceptować argument, powiedzmy, że powyższy kod zostanie zapisany w fun.sh, aby uruchomić funkcję ./fun.sh irfan & ./fun.sh config
źródło
Post rozwiązany, ale chciałbym wspomnieć o moim preferowanym rozwiązaniu. Mianowicie zdefiniuj ogólny jednoliniowy skrypt
eval_func.sh
:Następnie wywołaj dowolną funkcję w dowolnym skrypcie poprzez:
Problem, na który natknąłem się przy przyjętym rozwiązaniu, polega na tym, że podczas pozyskiwania mojego skryptu zawierającego funkcję w innym skrypcie argumenty tego drugiego byłyby oceniane przez ten pierwszy, powodując błąd.
źródło