Jaka jest różnica między wykonywaniem takiego skryptu:
./test.sh
i wykonanie takiego skryptu:
. test.sh
?
Próbowałem prostego, dwuwierszowego skryptu, aby sprawdzić, czy mogę znaleźć różnicę:
#!/bin/bash
ls
Ale oba . test.sh
i ./test.sh
zwróciły te same informacje.
test.sh
nie jest to samo co./test.sh
(pierwsze wywołujePATH
wyszukiwanie), tak. test.sh
i są. ./test.sh
różne w ten sam sposób (pierwsze wywołujePATH
wyszukiwanie). Wiele powłok wydaje się domyślnie zawierać.
na końcuPATH
podczas.
wyszukiwania ścieżki, ale takie zachowanie nie jest standardowe. Tak więc, jest bardziej dokładne, aby porównaćtest.sh
vs. test.sh
i./test.sh
kontra. ./test.sh
.Odpowiedzi:
./test.sh
działatest.sh
jako osobny program. Może się zdarzyć, że jest to skrypt bash, jeśli pliktest.sh
zaczyna się od#!/bin/bash
. Ale może to być coś zupełnie innego.. ./test.sh
wykonuje kod plikutest.sh
wewnątrz działającej instancji bash. Działa tak, jakby plik zawartościtest.sh
został dołączony tekstowo zamiast. ./test.sh
wiersza. (Prawie: istnieje kilka szczegółów, które się różnią, takich jak wartość$BASH_LINENO
i zachowaniereturn
wbudowanego.)source ./test.sh
jest identyczny jak. ./test.sh
w bash (w innych powłokachsource
może być nieco inny lub może zupełnie nie istnieć;.
do włączenia jest w standardzie POSIX).Najbardziej widoczną różnicą między uruchomieniem osobnego skryptu z wbudowanym skryptem
./test.sh
i włączeniem go.
jest to, że jeślitest.sh
skrypt ustawia niektóre zmienne środowiskowe, w osobnym procesie, ustawiane jest tylko środowisko procesu potomnego, zaś w przypadku włączenia skryptu środowisko jedynego procesu powłoki jest ustawiony. Jeśli dodać linięfoo=bar
wtest.sh
, aecho $foo
na koniec skryptu wywołującego, zobaczysz różnicę:źródło
echo $$
do skryptu pokaże różnicę całkiem wyraźnie.$$
Zmienna posiada PID bieżącej powłoki.. ./test.sh
wywołania z innego skryptu powłoki, aby użyć funkcji opisanych w test.sh. Mam na myśli, że nie tylko zmienne można ustawić, możesz także tworzyć nowe funkcje w ten sposób, które można wywołać z bash lub z innego skryptu.. /usr/libexec/company/tools; custom_command "variable
„Uruchomienie skryptu w pierwszy sposób uruchamia go jako proces potomny. Z drugiej strony Sourcing (drugi sposób) uruchamia skrypt tak, jakbyś wprowadził wszystkie jego polecenia do bieżącej powłoki - jeśli skrypt ustawi zmienną, pozostanie ustawiony, jeśli skrypt zakończy działanie, sesja zakończy się. Zobacz
help .
dokumentację.źródło
Inną rzeczą, na którą zwracam uwagę jest to, że jeśli masz taki alias:
Z
./test.sh
dostaniesz normalnels
wyjście (i inną niż bieżąca PID shell):Z
. test.sh
lub. ./test.sh
otrzymasz bardziej szczegółowy wynik (i ten sam PID niż bieżąca powłoka):źródło
.bashrc
if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi
Następnie, wstaw swoje aliasy.bash_aliases
.alias
słowa kluczowego? (Może to tylko pomyłka w twoim poście - na linii 3?)Głównym zastosowaniem dla mnie
source
(lub.
) są funkcje bash .Mam skrypty z wieloma funkcjami i wykonuję je wszystkie za pomocą moich
.bashrc
. Funkcje „stają się” poleceniami, których często używam.źródło