Add by Zhj: The main difference is that source is executing the script in the current shell, while SH, bash,./is executing the script in the child shell of the current shell
Original: http://www.cnblogs.com/pcat/p/5467188.html
In Linux, source, SH, bash,./can execute shell script files, what's the difference?
-----------
1. Source
SOURCE a.sh
Reads, executes a.sh in the current Shell , and a.sh does not need to have " Execute permission "
The source command can be abbreviated as "."
. a.sh
Note: There are spaces in the middle.
2, Sh/bash
SH A.shbash a.sh
is to open a subshell to read, execute a.sh, and a.sh do not need to have " Execute permission "
It is common to set variables in scripts running in Subshell without affecting the parent shell.
3,./
./a.sh#bash:./a.sh: Insufficient permissions chmod +x a.sh./a.sh
Open a Subshell to read, execute a.sh, but a.sh need to have " Execute permission "
You can add execute permissions with chmod +x
4. Fork, source, exec
- When you run a script using fork, the shell (parent process) produces a child process to execute the script, and when the child process finishes, it returns to the parent process, but the parent The process environment is not changed by the change of child process.
- When you run a script using source, the script executes within the current process, rather than creating a child process. As all execution results are completed within the current process, if the context of the script changes, it will certainly change the current process environment.
- When you run script with exec, it is the same as source, where script executes within the current process, but the remainder of the original code within the process is terminated. Similarly, the environment within the process changes as the script changes.
Usually, if we do, it is the default fork.
For the sake of practice, we can build 2 sh files first, the following code comes from Chinaunix's network person:
1.sh
#!/bin/BashA=BEcho "PID for 1.sh before exec/source/fork:$$"Export AEcho "1.sh: \ $A is $A" Case$1 inchexec)Echo "using exec ..."exec./2.SH ;; SOURCE)Echo "using Source ..." . ./2.SH ;; *) Echo "using fork by default ..." ./2.SH ;;EsacEcho "PID for 1.sh after exec/source/fork:$$"Echo "1.sh: \ $A is $A"
2.sh
#!/bin/bashecho"PID for 2.sh: $$"echo"2.sh get \ $A = $A from 1.sh"a=cexport a-echo"2.sh: \ $A is $A "
Run it yourself and watch the results:)
chmod 1. SH chmod 2. SH . /1. SH Fork. /1. SH source. /1. SH exec
Linux in source, SH, bash,./What's the Difference (RPM)