Outros disseram que a diferença é sourcing x executar, mas ninguém descreveu as diferenças funcionais .
A maior diferença funcional é que exit
, cd
e atribuições de variáveis afetarão o shell atualmente em execução se você o fornecer, mas não se você executá-lo. Para demonstrar, tente o seguinte:
$ cat test.sh
#!/bin/bash
mkdir -p test
cd test
pwd
foo=bar
echo script foo: $foo
$ ./test.sh
/Users/kevin/test
script foo: bar
$ echo $foo
$ pwd
/Users/kevin
$ . test.sh
/Users/kevin/test
script foo: bar
$ echo $foo
bar
$ pwd
/Users/kevin/test
$
Agora tente isto:
$ cat test.sh
#!/bin/bash
exit
$ ./test.sh
$ . test.sh
[Process completed]
Como você pode ver, exit
em um script executado terminará esse script, mas se você criar um script com exit
, ele sairá do seu shell atual!