What is the difference between sourcing ('.' or 'source') and executing a file in bash?
./test.sh
runs test.sh
as a separate program. It may happen to be a bash script, if the file test.sh
starts with #!/bin/bash
. But it could be something else altogether.
. ./test.sh
executes the code of the file test.sh
inside the running instance of bash. It works as if the content file test.sh
had been included textually instead of the . ./test.sh
line. (Almost: there are a few details that differ, such as the value of $BASH_LINENO
, and the behavior of the return
builtin.)
source ./test.sh
is identical to . ./test.sh
in bash (in other shells, source
may be slightly different or not exist altogether; .
for inclusion is in the POSIX standard).
The most commonly visible difference between running a separate script with ./test.sh
and including a script with the .
builtin is that if the test.sh
script sets some environment variables, with a separate process, only the environment of the child process is set, whereas with script inclusion, the environment of the sole shell process is set. If you add a line foo=bar
in test.sh
and echo $foo
at the end of the calling script, you'll see the difference:
$ cat test.sh
#!/bin/sh
foo=bar
$ ./test.sh
$ echo $foo
$ . ./test.sh
$ echo $foo
bar
Running a script the first way runs it as a child process. Sourcing (the second way), on the other hand, runs the script as if you entered all its commands into the current shell - if the script sets a variable, it will remain set, if the script exits, your session will exit. See help .
for documentation.
Another thing that I note is that if you have an alias like this:
# add into .bashrc_aliases
alias ls='ls -lht'
With ./test.sh
you'll get a normal ls
output (and a different PID than current shell):
auraham@pandora:~/iso$ ./test.sh
dsl-4.4.10.iso test.sh
3136 # PID
With . test.sh
or . ./test.sh
you'll get a more detailed output (and the same PID than current shell):
auraham@pandora:~/iso$ echo $$
2767 # shell PID
auraham@pandora:~/iso$ . test.sh
total 50M
drwxrwxr-x 2 auraham auraham 4.0K Jul 30 15:41 .
-rwxrwxr-x 1 auraham auraham 32 Jul 30 15:41 test.sh
drwxr-xr-x 50 auraham auraham 4.0K Jul 30 15:30 ..
-rw-rw-r-- 1 auraham auraham 50M Jul 28 17:24 dsl-4.4.10.iso
2767 # PID