Jakie jest znaczenie kropki przed poleceniem w powłoce?

74

Podczas śledzenia samouczka debugowania systemu Android Eclipse napotykam następujące polecenia.

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator

Mój problem polega na tym, co build/envsetup.shoznacza kropka przedtem ?

Jichao
źródło

Odpowiedzi:

78

Kropka w tym kontekście oznacza „źródło” zawartości tego pliku do bieżącej powłoki. Z sourcesamego bycia wbudowanego polecenia powłoki. A sourceoperator kropki jest synonimem.

Przykład

Powiedzmy, że miałem w sample.shpliku 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.

Przykłady

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 envponownie sprawdzimy zmienne:

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
slm
źródło
70

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 fooskrypt

. ./foo

Lub równoważnie:

source ./foo

Jeśli zrobimy pwdpóź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ę.

Samiam
źródło
6
Twoja odpowiedź jest lepsza niż zaakceptowana, zrozumiałem, jak to wyjaśniłeś, dzięki!
Ahmed,
5

Kropka (kropka) to krótka ręka dla wbudowanej bash source. Odczyta i wykona polecenia z pliku w bieżącym środowisku i zwróci status wyjścia ostatniego wykonanego polecenia. Pliki mogą znajdować się w bieżącym katalogu lub w dowolnym miejscu w PATH. Nie musi być wykonywalny.

tlund
źródło
1

Jak się dowiedzieć.

# 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.
ctrl-alt-delor
źródło
Myślę, że w podręczniku brakuje przecinka. Powinien powiedzieć „Wykonuj polecenia z pliku w bieżącej powłoce”.
ctrl-alt-delor
1

. (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.

Źródło

Premraj
źródło
0

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)

mochomecha
źródło
2
Witamy w U&L! Ta odpowiedź powiela informacje, które są już w zaakceptowanej odpowiedzi i tak naprawdę nic nie dodaje.
JigglyNaga,