Risposte:
Un punto in quel contesto significa "sorgente" il contenuto di quel file nella shell corrente. Con source
se stesso essendo un comando incorporato della shell. E source
l'operatore punto è sinonimo di sinonimi.
Supponiamo di avere i seguenti contenuti in un sample.sh
file.
$ cat sample.sh
echo "hi"
echo "bye?"
Ora quando lo fonte:
$ . sample.sh
hi
bye?
$
File di questo tipo vengono spesso utilizzati per incorporare comandi di installazione come l'aggiunta di elementi a una delle variabili di ambiente.
Dire che ho avuto questi comandi in un altro file, addvars.sh
.
$ cat addvars.sh
export VAR1="some var1 string"
export VAR2="some var2 string"
Si noti che non ho alcuna variabile nell'ambiente della mia shell corrente.
$ env | grep VAR
$
Ora, quando fonte questo file:
$ . addvars.sh
$
OK, sembra che non abbia fatto nulla, ma quando controlliamo di env
nuovo le variabili:
$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
Per aggiungere alla risposta di slm:
Esistono due modi per eseguire uno script di shell. Uno è quello di eseguire lo script in un processo separato, il che significa che qualsiasi cosa sull'ambiente della shell (stato di memoria) tornerà allo stato della shell "parent" prima di eseguire il processo della shell "child".
Ad esempio, l'attuale directory di lavoro (la posizione nel filesystem in cui ci si trova) viene determinata in base al processo. Quindi, facciamo uno script simile al seguente:
#!/bin/bash
cd ~
cd ..
pwd
Quindi, chiamiamo questo script, oh, foo
. Ed eseguiamo questo script come segue:./foo
Vedremo quanto segue:
/home
(Dichiarazione di non responsabilità standard che esiste un gran numero di distribuzioni di cloni Linux e di altri UNIX là fuori, alcune delle quali non inseriscono le directory degli utenti /home
. Oppure, come si diceva "Il tuo chilometraggio può variare")
Ora, dopo aver eseguito questo script, digitiamo questo comando
pwd
Per vedere in quale directory ci troviamo. Vedremo qualcosa del genere:
/home/username
Il motivo è, ancora una volta, lo script di shell che abbiamo eseguito aveva il suo ambiente (inclusa la sua directory in cui venivano eseguiti i comandi) e quell'ambiente è andato via una volta che lo script ha terminato l'esecuzione.
Ora eseguiamo lo foo
script in questo modo
. ./foo
O, equivalentemente:
source ./foo
Se lo facciamo pwd
dopo, vedremo questo:
/home
Il motivo è: il sourcing di uno script non chiama un processo separato. È come digitare a mano tutti i comandi nel processo genitore; il suo ambiente viene preservato al termine dello script.
Vorrei fare un esempio più semplice. Facciamo uno script simile al seguente:
#!/bin/bash
exit
Diamo un nome foo
. Facciamo in modo che siamo in grado di eseguirlo: chmod 755 foo
. Quindi, eseguiamolo in questo modo:
./foo
Non succede nulla. Tuttavia, d'altra parte, se lo facciamo:
. ./foo
O questo:
source ./foo
Disconnettiamo.
Il punto (punto) è una scorciatoia per il bash incorporato source
. Leggerà ed eseguirà i comandi da un file nell'ambiente corrente e restituirà lo stato di uscita dell'ultimo comando eseguito. I file possono trovarsi nella directory corrente o in qualsiasi punto del file PATH
. Non deve essere eseguibile.
# 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.
. (operatore sorgente o punto)
Legge ed esegue i comandi dall'argomento nomefile nel contesto della shell corrente.
Syntax
. filename [arguments]
source filename [arguments]
source è sinonimo di punto / punto "." in bash, ma non in POSIX sh, quindi per la massima compatibilità utilizzare il punto.
Quando uno script viene eseguito utilizzando l'origine, viene eseguito all'interno della shell esistente, tutte le variabili create o modificate dallo script rimarranno disponibili dopo il completamento dello script. Al contrario, se lo script viene eseguito proprio come nome file, viene generata una sottostruttura separata (con un set di variabili completamente separato) per eseguire lo script.
C'è una sottile differenza tra l'esecuzione di uno script eseguendo .ss64script (dot ss64script) e. ss64script (dot space ss64script)
il primo sta eseguendo un file che è stato nascosto dal comando 'ls', (sebbene ls -a mostrerà i file nascosti) la seconda opzione eseguirà ss64script anche se non è stato impostato come eseguibile con chmod.
TL; DR
Il punto è uguale al comando sorgente.
source è un comando Unix che valuta il file seguendo il comando, come un elenco di comandi, eseguito nel contesto corrente.
Estratto da https://en.wikipedia.org/wiki/Source_(command)