Konfiguruję skrypt powłoki z menu i podmenu, opcji itp. Ale w każdym menu / podmenu / etc potrzebuję opcji „Wróć do menu głównego”.
Mam już skonfigurowane menu i działa dobrze, ale potrzebuję sposobu, aby po prostu ponownie uruchomić skrypt od zera, zresetować wszystkie zmienne itp.
Lub sposób na wyjście z bieżącego skryptu i ponowne uruchomienie go.
Próbowałem to zrobić:
ScriptLoc=$(readlink -f "$0")
./ScriptLoc
Ale to zaczyna „nowy” skrypt w „starym” skrypcie, więc kiedy wychodzę z „nowego” skryptu, wraca do „starego” skryptu (jeśli to ma sens). To jest skrypt wewnątrz czegoś w rodzaju skryptu.
Czy ktoś ma pomysł, jak całkowicie go zrestartować?
command-line
scripts
restart
Moonbloom
źródło
źródło
$ScriptLoc
:./ScriptLoc
szuka skryptu o tej nazwie w bieżącym katalogu.Odpowiedzi:
Tak
exec
Bash wbudowane polecenia zastępuje aktualny program z nowym.źródło
Możesz użyć czegoś takiego:
$(basename $0)
utworzy nową instancję bieżącego skryptu iexit
wyjdzie z bieżącej instancji skryptu.Oto skrypt testowy, który podkreśla powyższą metodę:
Jeśli nie użyjesz
export count=0
(któracount
zmienia się w zmienną środowiskową) i użyjesz tylkocount=0
(która tworzycont
zmienną skryptu lokalnego), skrypt nigdy się nie zatrzyma.źródło
&& exit
zakończy działanie tylko wtedy, gdy skrypt się powiedzie. Jeśli na przykład skrypt nie jest wykonywalny lub występuje błąd składniowy, prawdopodobnie się po prostu zakręci.Wiarygodne uzyskanie aktualnie wykonywanego skryptu jest trudniejsze niż mogłoby się wydawać. Zobacz http://mywiki.wooledge.org/BashFAQ/028 .
Zamiast tego możesz zrobić coś takiego:
Zasadniczo uruchamiasz funkcję main_menu w podpowłoce, więc jeśli wyjdziesz z main_menu lub dowolnego z podmenu, opuścisz podpowłokę, a nie główną powłokę. status wyjścia 255 jest tutaj wybrany, aby oznaczać „idź ponownie”. Każdy inny status wyjścia wyłamie się z nieskończonej pętli.
źródło