The differences between sh, source and ./ :
source foo.sh ( . foo.sh):
- read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename (so attributes and environment of the current shell could be changed)
- it's just like when you copy and past line by line of your foo.sh file and press Enter after every line
sh foo.sh:
- run in a subshell, any changes that foo.sh makes to the shell enviroment would not persist after the process has ended
- there is also no necessarity of a hashbang line in it. (直接运行解释器)
./foo.sh:
- execute the file in the current directory
- the hashbang line would be detected, for example, the first line #!/bin/sh is equal to /bin/sh ./foo.sh
- the file needs the permisson as it is supposed to be an executable: chmod +x ./foo.sh. (with sh, the file, as an argument for sh, does not need to have execute permission set on it)
- 要写成 ./foo.sh,而不是 foo.sh;如果直接写 foo.sh,linux 会去 PATH 里寻找有没有叫 foo.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 foo.sh 会找不到命令,要用 ./foo.sh 告诉系统就在当前目录找。