Primeiro de tudo . file
não executa o arquivo, ele o origina. Isso pode soar como um ponto pedante, mas há uma diferença importante. Quando você executa um arquivo, ele é executado em seu próprio subshell; quaisquer variáveis definidas nele, por exemplo, não serão propagadas para a sessão pai. Para ilustrar, considere este script ( foo.sh
) que simplesmente define uma variável e depois a imprime:
foo="bar"
echo "In the script, foo is $foo"
Agora, vamos definir a variável foo
para algo, depois executar esse script e, quando terminar, echo $foo
:
$ foo="baz"
$ bash foo.sh
In the script, foo is bar
$ echo $foo
baz
Como você pode ver, $foo
foi definido dentro do script, mas isso não alterou o valor da variável no shell pai. Compare o que precede com o que acontecerá se nós fornecermos o script:
$ . foo.sh
In the script, foo is bar
$ echo $foo
bar
Desta vez, como o script foi originado, a variável também foi alterada no shell pai.
O > file
é mais simples. O operador >
abre um arquivo (ou o cria, se ele não existir) para gravação e sobrescreve imediatamente qualquer coisa que já esteja no arquivo. Portanto, se você executar apenas > file
com nada mais, o >
esvaziará o arquivo, se existir.