Qual è la differenza tra l'esecuzione di uno script come questo:
./test.sh
ed eseguire uno script come questo:
. test.sh
?
Ho provato un semplice script a due righe per vedere se riuscivo a trovare se c'era una differenza:
#!/bin/bash
ls
Ma entrambi . test.sh
e ./test.sh
ha restituito le stesse informazioni.
Risposta accettata:
./test.sh
esegue test.sh
come programma separato. Potrebbe essere uno script bash, se il file test.sh
inizia con #!/bin/bash
. Ma potrebbe essere qualcos'altro.
. ./test.sh
esegue il codice del file test.sh
all'interno dell'istanza in esecuzione di bash. Funziona come se il file di contenuto test.sh
era stato incluso testualmente al posto del . ./test.sh
linea. (Quasi:ci sono alcuni dettagli che differiscono, come il valore di $BASH_LINENO
e il comportamento del return
integrato.)
source ./test.sh
è identico a . ./test.sh
in bash (in altre shell, source
potrebbe essere leggermente diverso o non esistere del tutto; .
per l'inclusione è nello standard POSIX).
La differenza più comunemente visibile tra l'esecuzione di uno script separato con ./test.sh
e includendo uno script con il .
builtin è che se il test.sh
script imposta alcune variabili di ambiente, con un processo separato viene impostato solo l'ambiente del processo figlio, mentre con l'inclusione di script viene impostato l'ambiente dell'unico processo shell. Se aggiungi una riga foo=bar
in test.sh
e echo $foo
alla fine dello script di chiamata, vedrai la differenza:
$ cat test.sh
#!/bin/sh
foo=bar
$ ./test.sh
$ echo $foo
$ . ./test.sh
$ echo $foo
bar