Cosa sta facendo il comando 'dot space nomefile' in bash?


30

Quando utilizzo la shell bash, a volte conservo le variabili di ambiente in un file di testo di cui copio / incolgo il contenuto, ad esempio export.txt:

export FOO=bar
export FIZZ=buzz

Qualcuno mi ha mostrato invece di copiare / incollare, potrei digitare nel terminale

. exports.txt

che avrebbe lo stesso effetto di copia / incolla.

Qual è il meccanismo con cui funziona questo comando 'dot space nomefile'? È difficile pensare ai termini di ricerca per questo.

Voglio capire cosa sta succedendo e i dettagli più generali di ciò che sta facendo questo one-liner.


23
Esegui help . Questo è così breve che il motore di Stack Exchange pensa che sia troppo corto per essere un commento.
Carattere jolly

5
Mi chiedo perché tutte queste domande si verifichino anche in questo sito. Hanno ricevuto molte risposte in StackTranslate.it , Ask Ubuntu e Unix & Linux .
fedorqui,

Per eseguire il punto-spazio, è necessario digitare '. ' args, con virgolette singole o doppie. Altrimenti lo spazio non quotato viene consumato da bash quando analizza la linea in token (vedere "suddivisione delle parole" nel manuale di bash).
Peter Cordes,

1
In bash, un nome alternativo per .è source, che significa letteralmente "comandi di origine da questo file", almeno per me.
jpaugh,

Risposte:


40

Il .comando ("punto") è un sinonimo / collegamento per il sourcecomando integrato della shell .

Fa sì che lo script della shell denominato venga letto ed eseguito nel contesto della shell corrente (anziché in una subshell). Ciò consente allo script di origine di modificare l'ambiente della shell chiamante, come l'impostazione delle variabili e la definizione di funzioni e alias della shell.


49
In realtà, sourceè un sinonimo / scorciatoia non standard e non portatile per il comando "dot" ( ) definito da POSIX. , non viceversa.
terdon,

8
bash fornisce una modalità non standard sourcee una non standard .in modalità non POSIX, entrambe le quali cercano la directory corrente anche se non fa parte di essa $PATH. In modalità POSIX, fornisce uno standard .che non cerca nella directory corrente e no source. In nessuna delle due modalità è sourcesinonimo del .comando POSIX .
hvd,

26

Mentre le due risposte esistenti sono già eccellenti, sento l'esempio in cui l'effetto è il più "evidente", per così dire, manca.

Di 'che ho un file script.shcon i seguenti contenuti:

cd dir

Se avessi eseguito questo script normalmente ( sh script.sh), vedrei questo:

olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$

Ma se dovessi trovare lo script ( . script.sh), finirei con questo:

olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$

Nota come nel secondo caso è cambiata la directory di lavoro della nostra shell principale!

Questo perché (come fuori punte nelle altre risposte) Il primo esempio viene eseguito nel proprio subshell (il shprocesso che comincia con il sh-command, questo avrebbe potuto essere praticamente qualsiasi shell, bash, dash, è il nome), cambia directory lì, non fa nulla e si chiude. Mentre il secondo esempio viene eseguito nella nostra shell principale, e quindi cambia directory lì!


4

Ecco un esempio

File di script: mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

se provi a stampare una qualsiasi delle variabili sopra non otterrai nulla

echo $myvar

ma se lo fai

. mytest.sh

o

source mytest.sh

e poi

echo $myvar

stamperà 1

Solo una risposta visiva di ciò che Spiff ha scritto


Quindi, interpretando il tuo esempio, usare exportè solo se quelle variabili devono essere usate nei subshells. Potrei omettere exportil file se le variabili devono essere utilizzate solo nella shell corrente. È giusto?
iancoleman,

1
Abbastanza bene e potrei dire di sì. Tuttavia l'uso del comando export è più utile o più comprensibile se si pensa alle variabili di ambiente shell. Ad esempio $ HOME o $ DISPLAY. Sì, è possibile utilizzare il comando export per esportare una variabile nella sessione della shell o in qualsiasi subshell, ma andrà non appena si termina quella sessione.
raismo,
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.