Odpowiedzi:
Kropka w tym kontekście oznacza „źródło” zawartości tego pliku do bieżącej powłoki. Z source
samego bycia wbudowanego polecenia powłoki. A source
operator kropki jest synonimem.
Powiedzmy, że miałem w sample.sh
pliku następującą zawartość .
$ cat sample.sh
echo "hi"
echo "bye?"
Teraz, gdy go pozyskuję:
$ . sample.sh
hi
bye?
$
Pliki takie jak ten są często używane do dołączania poleceń instalacyjnych, takich jak dodawanie elementów do zmiennych środowiskowych.
Powiedzieć, miałem te polecenia w innym pliku addvars.sh
.
$ cat addvars.sh
export VAR1="some var1 string"
export VAR2="some var2 string"
Zauważ, że nie mam żadnych zmiennych w moim bieżącym środowisku powłoki.
$ env | grep VAR
$
Teraz, gdy źródła tego pliku:
$ . addvars.sh
$
OK, wygląda na to, że nic nie zrobił, ale kiedy env
ponownie sprawdzimy zmienne:
$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
Aby dodać do odpowiedzi SLM:
Istnieją dwa sposoby uruchomienia skryptu powłoki. Jednym z nich jest uruchomienie skryptu w osobnym procesie, co oznacza, że wszystko w środowisku powłoki (stan pamięci) powróci do stanu powłoki „macierzystej” przed uruchomieniem procesu powłoki „potomnej”.
Na przykład bieżący katalog roboczy (lokalizacja w systemie plików, w którym znajduje się jeden) jest określany dla poszczególnych procesów. A więc przygotujmy skrypt, który wygląda tak:
#!/bin/bash
cd ~
cd ..
pwd
Tak, nazwijmy to skrypt, och, foo
. Uruchommy ten skrypt w następujący sposób:./foo
Zobaczymy:
/home
(Standardowe zrzeczenie się, że istnieje duża liczba dystrybucji klonów Linux i innych UNIX, z których niektóre nie umieszczają katalogów użytkownika /home
. Lub, jak mówiliśmy „Twój przebieg może się różnić”)
Teraz po uruchomieniu tego skryptu wpiszmy to polecenie
pwd
Aby zobaczyć, w którym katalogu się znajdujemy. Zobaczymy coś takiego:
/home/username
Ponownie dlatego, że skrypt powłoki, który uruchomiliśmy, miał swoje własne środowisko (w tym własny katalog, w którym były uruchamiane polecenia) i środowisko to zniknęło po zakończeniu działania skryptu.
Teraz uruchommy taki foo
skrypt
. ./foo
Lub równoważnie:
source ./foo
Jeśli zrobimy pwd
później, zobaczymy:
/home
Powodem jest: Pozyskanie skryptu nie wywołuje osobnego procesu. To jest jak ręczne wpisywanie wszystkich poleceń w procesie nadrzędnym; jego środowisko jest zachowywane po zakończeniu skryptu.
Pozwól, że przedstawię prostszy przykład. Przygotujmy skrypt, który wygląda następująco:
#!/bin/bash
exit
Nazwijmy to foo
. Zróbmy pewien, że można go uruchomić: chmod 755 foo
. Następnie uruchommy to w ten sposób:
./foo
Nic się nie dzieje. Z drugiej strony, jeśli to zrobimy:
. ./foo
Albo to:
source ./foo
Wylogowujemy się.
# type .
. is a shell builtin
# help .
.: . filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
. (operator źródła lub kropki)
Odczytywanie i wykonywanie poleceń z argumentu nazwa pliku w bieżącym kontekście powłoki.
Syntax
. filename [arguments]
source filename [arguments]
źródło jest synonimem kropki / kropki ”.” w bash, ale nie w POSIX sh, więc dla maksymalnej kompatybilności użyj kropki.
Gdy skrypt jest uruchamiany przy użyciu źródła, działa w ramach istniejącej powłoki, wszelkie zmienne utworzone lub zmodyfikowane przez skrypt pozostaną dostępne po zakończeniu skryptu. W przeciwieństwie do tego, jeśli skrypt jest uruchamiany tak jak nazwa pliku, wówczas osobna podpowłoka (z całkowicie oddzielnym zestawem zmiennych) zostałaby spawnowana w celu uruchomienia skryptu.
Istnieje niewielka różnica między wykonywaniem skryptu przez uruchomienie .ss64script (kropka ss64script) i. ss64script (spacja kropkowa ss64script)
pierwszy uruchamia plik, który został ukryty przed poleceniem 'ls' (chociaż ls -a pokaże ukryte pliki), druga opcja wykona skrypt ss64, nawet jeśli nie został ustawiony jako plik wykonywalny z chmod.
TL; DR
Kropka jest taka sama jak polecenie źródłowe.
source to uniksowe polecenie, które ocenia plik następujący po poleceniu, jako listę poleceń wykonanych w bieżącym kontekście.
Wyodrębniono z https://en.wikipedia.org/wiki/Source_(command)