Qual è il significato di un punto prima di un comando in shell?


76

Mentre seguo il tutorial di debug di eclissi Android, incontro i seguenti comandi.

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

Il mio problema è cosa build/envsetup.shsignifica il punto prima ?

Risposte:


80

Un punto in quel contesto significa "sorgente" il contenuto di quel file nella shell corrente. Con sourcese stesso essendo un comando incorporato della shell. E sourcel'operatore punto è sinonimo di sinonimi.

Esempio

Supponiamo di avere i seguenti contenuti in un sample.shfile.

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

Esempi

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 envnuovo le variabili:

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string

72

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 fooscript in questo modo

. ./foo

O, equivalentemente:

source ./foo

Se lo facciamo pwddopo, 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.


6
La tua risposta è migliore di quella accettata, ho capito come hai spiegato, grazie!
Ahmed,

Dun-da-da-duuuun! (rullo di tamburi, per favore) ... e la frase più importante di tutte è !: Il motivo è: 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.
Gabriel Staples,

Dovresti condurre con il secondo esempio. Contiene più pugno.
MonoThreaded

5

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.


1

Come scoprirlo

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

Penso che manchi una virgola nel manuale. Dovrebbe essere indicato "Esegui comandi da un file, nella shell corrente."
ctrl-alt-delor

1

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

fonte


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.