What is the difference between executing a Bash script like A and sourcing a Bash script like B?
A
> ./myscript
B
> source myscript
bashlinuxscript
What is the difference between executing a Bash script like A and sourcing a Bash script like B?
A
> ./myscript
B
> source myscript
Best Answer
Sourcing a script will run the commands in the current shell process.
Executing a script will run the commands in a new shell process.
Use source if you want the script to change the environment in your currently running shell. use execute otherwise.
the "environment" are things like the current working directory and environment variables. also shell settings (among others history and completion features). there are more but those are the most visible.
If you want more details please read on.
Terminology
To clarify some common confusion about the syntax to execute and the syntax to source:
This will execute
myscript
provided that the file is executable and located in the current directory. The leading dot and slash (./
) denotes the current directory. This is necessary because the current directory is usually not (and usually should not be) in$PATH
.This will execute
myscript
if the file is executable and located in some directory in$PATH
.This will source
myscript
. The file need not be executable but it must be a valid shell script. The file can be in current directory or in a directory in$PATH
.This will also source
myscript
. This "spelling" is the official one as defined by POSIX. Bash definedsource
as an alias to the dot.and for completeness:
This will terminate the current shell and then execute myscript in place of the terminated shell. That means when myscript is done there no old shell to return to.
exec
is powerful but rarely needed.I put some links at the end for more information on these topics.
Demonstration
Consider
myscript.sh
with following content:Before we execute the script first we check the current environment:
The variable
FOO
is not defined and we are in the home directory.Now we execute the file:
Check the environment again:
The variable
FOO
is not set and the working directory did not change.The script output clearly shows that the variable was set and the directory was changed. The check afterwards show that the variable is not set and the directory not changed. What happened? The changes were made in a new shell. The current shell spawned a new shell to run the script. The script is running in the new shell and all changes to the environment take effect in the new shell. After the script is done the new shell is destroyed. All changes to the environment in the new shell are destroyed with the new shell. Only the output text is printed in the current shell.
Now we source the file:
Check the environment again:
The variable FOO is set and the working directory has changed.
Sourcing the script does not create a new shell. All commands are run in the current shell and changes to the environment take effect in the current shell.
Note that in this simple example the output of executing is the same as sourcing the script. This is not necessarily always the case.
Another Demonstration
Consider following script
pid.sh
:(the special variable
$$
expands to the PID of the current running shell process)First print the PID of the current shell:
Source the script:
Execute the script, note the PID:
Source again:
Execute again:
You can see that sourcing the script runs in the same process while executing the script creates a new process everytime. That new process is the new shell which was created for the execution of the script. Sourcing the script does not create a new shell and thus the PID stays the same.
Summary
Both sourcing and executing the script will run the commands in the script line by line, as if you typed those commands by hand line by line.
The differences are:
Use source if you want the script to change the environment in your currently running shell. use execute otherwise.
See also: