uruchamianie skryptu za pomocą „. ”I„ źródłem ”

26
  1. Zastanawiałem się, czy następujące dwa sposoby uruchamiania skryptu bash są równoważne?

    . ./myScript.sh
    
    source myScript.sh
  2. Czy obaj uruchamiają treść skryptu zamiast skryptu, tzn. Nie tworzą podpowłoki do uruchomienia skryptu?
Tim
źródło
1
Hej, to jest na stronie podręcznika!
alex
@alex: pokaż mi proszę? man ., man sourceCzy cokolwiek jeszcze nie wiem.
Tim
2
Zobacz type .ihelp .
rozcietrzewiacz
man $SHELL,/source
alex
4
. jest bardziej przenośny według innych.
l0b0

Odpowiedzi:

21
  1. Są równoważni w bash, ponieważ robią dokładnie to samo. Z drugiej strony sourcejest 5 znaków dłuższych i nie można go przenosić na powłoki tylko POSIX lub Bourne, podczas gdy .(kropka) jest, więc nigdy nie zawracam sobie głowy używaniem source.

  2. To prawda - podczas pobierania pliku uruchamiane są polecenia w bieżącej powłoce i wpływa to na bieżące środowisko powłoki. Nadal możesz przekazywać argumenty do pliku źródłowego, a bash faktycznie szuka $PATHnazwy pliku, tak jak normalne polecenie, jeśli nie zawiera żadnych ukośników.


Nie związane z pierwotnym pytaniem .vs source, ale w twoim przykładzie

. ./myScript.sh 

nie jest identyczny z

source myScript.sh

ponieważ podczas .i sourcesą funkcjonalnie identyczne myScript.shi ./myScript.shnie są takie same. Ponieważ ./myScript.shzawiera ukośnik, jest interpretowany jako ścieżka, a powłoka po prostu używa ./myScript.sh. Jednak myScript.shnie ma ukośnika, więc powłoka $PATHnajpierw go szuka. Jest to standardowe zachowanie określone przez POSIX. . Większość powłok domyślnie tego używa, chociaż mogą dodawać rozszerzenia (takie jak wyszukiwanie w bieżącym katalogu roboczym po wyszukiwaniu ścieżki) lub opcje zmiany zachowania ./ source.

jw013
źródło
2
zachowanie, gdy podana ścieżka do pliku nie zawiera pliku, zależy od /powłoki bashi zshzależy od tego, czy tryb POSIX jest włączony, czy nie. Zauważ też, że w wielu implementacjach ksh .zachowuje się inaczej niż source.
Stéphane Chazelas,
@StephaneChazelas Tak, masz rację. Dodałem notatkę, aby wyjaśnić, że powyższy opis jest standardem POSIX.
jw013,
8

Tak, są równoważne. Nie ma żadnej różnicy funkcjonalnej; .jest tylko wbudowanym synonimem source.

(Edycja: Najwyraźniej jest to prawdą tylko dla bashi zshNiektóre lżejsze pociski nie mają. source, Tylko .jest określony przez POSIX tak ksh, dash, ash, itd. Nie mogą mieć sourceSee. Odpowiedź jw013 koszulka dla informacji).

Caleb
źródło
Dzięki! Ale $ alias .wyniki bash: alias: .: not found .
Tim
Oznacza to, że oba są wbudowane, a także wbudowany alias. Jest to udokumentowane , ale myślę, że „synonim” jest właściwym terminem w tym przypadku, a nie „alias”.
Caleb