Mam jedno źródło bash run.sh
w następujący sposób,
#!/bin/bash
if [ $# -ne 1 ]; then
exit
fi
...
kiedy wykonuję to na dwa sposoby, są różne zachowania. Pierwszy sposób to
source run.sh
Zamknie terminal po wykonaniu. Drugi sposób to
./run.sh
to po prostu zakończy działanie skryptu i pozostanie na terminalu. Pytam, czy istnieje polecenie wyjścia ze skryptów bash dla obu source run.sh
i ./run.sh
wykonania. Próbowałem return
też, co nie działa dobrze w trakcie ./run.sh
wykonywania.
Mówiąc bardziej ogólnie, interesuje mnie, dlaczego tak się dzieje i jaka jest różnica między użyciem „źródła” i „.” do wykonania skryptu?
$- = *i*
?-
zawiera aktualnie aktywne flagi opcji. Test sprawdza, czy-i
flaga jest aktywna. Zobacz gnu.org/software/bash/manual/html_node/Special-Parameters.htmlPomyśl o poleceniu „source” jak w instrukcji „include”. Pobiera treść argumentu i uruchamia go tak, jakby był uruchamiany bezpośrednio. W tym przypadku twoje polecenie jest „source” z argumentem „run.sh”, a run.sh jest wykonywany dokładnie tak, jakbyś wpisał treść run.sh w linii poleceń.
Po uruchomieniu polecenia „./run.sh” polecenie „./run.sh” nie zawiera argumentów. Ponieważ ten plik jest zwykły, a nie binarny, twoja powłoka szuka interpretera w shebang ('#!' W pierwszym wierszu) i znajduje '/ bin / bash'. Więc twoja powłoka następnie uruchamia nową instancję bash, a zawartość run.sh jest uruchamiana wewnątrz tej nowej instancji.
Po pierwsze, gdy bash osiągnie komendę „exit”, jest wykonywany dokładnie tak, jakbyś wpisał go w linii poleceń. W drugim przypadku jest on wykonywany w procesie bash, który uruchomiła twoja powłoka, dlatego tylko to wystąpienie bash otrzymuje polecenie „exit”.
Gdy wpiszesz wiersz w bash, wszystko przed pierwszą spacją jest traktowane jako polecenie, a wszystko, co następuje, jest traktowane jako argumenty. Komenda '.' jest aliasem „źródła”. Kiedy biegniesz ”. run.sh „the”. jest samodzielnym poleceniem, ponieważ jest oddzielone od argumentów spacją. Po uruchomieniu polecenia „./run.sh” polecenie brzmi „./run.sh” i „.” jest częścią ścieżki względnej do run.sh z „.” reprezentujący twój bieżący folder.
źródło