Quando você executa ./script.sh
, o script é executado em um subshell. Portanto, qualquer operação / alteração que o script deva fazer é realizada no subshell, portanto, o shell pai, ou seja, a partir do shell do qual o script foi chamado, não é afetado pelas alterações.
Por outro lado, quando você faz . script.sh
( .
é o mesmo que shell builtin source
), o script é source significando que todos os comandos são executados nesta instância de shell (da qual ele é chamado ). Portanto, qualquer alteração nos atributos, como variáveis, declaração de funções afeta o shell.
Normalmente, source
é usado para arquivos de configuração do usuário. ~/.bashrc
depois de fazer qualquer modificação, por exemplo adicionando um novo caminho para PATH
, para que a alteração seja aplicada a partir da sessão atual do shell.
Talvez um exemplo torne você mais claro:
$ cat script.sh ##Our test script, containing just a variable (spam) declaration
#!/bin/bash
spam=foobar
$ ./script.sh ## Execute using ./script.sh
$ echo "$spam" ## Prints nothing
$ . script.sh ## Lets source it
$ echo "$spam" ## Now we get it
foobar