为什么`sh myscript`和`source myscript`之间的$ 0不同?

时间:2017-06-08 14:31:48

标签: linux bash shell unix

我有一个非常简单的shell脚本名test.sh

[mylinux ~]$ cat test.sh
echo "a"
echo "${0}"

然而,当我source它和sh时,结果却完全不同:

[mylinux ~]$ sh test.sh 
a
test.sh
[mylinux ~]$ source test.sh 
array : x, y
0,x
1,x

我无法理解source test.sh的结果,在我更改test.sh的名称后,结果也发生了变化:

[mylinux ~]$ mv test.sh a.sh
[mylinux ~]$ source a.sh 
a
-bash

我如何理解这种现象?

,第二个奇怪的结果只出现在我的一个远程linux会话中,在我的本地linux系统中,一切正常。那么肯定它与环境有关,我能做些什么才能找到根本原因?

我发现了真正的问题,即即使它们不是这样的文件test.sh,我甚至可以执行source test.sh来获得结果:

[mylinux ~]$ rm test.sh 
[mylinux ~]$ source test.sh
array : x, y
0,x
1,x

对我来说这很奇怪......

2 个答案:

答案 0 :(得分:3)

如果参数不包含任何source字符,

/会对其参数执行路径查找,因此保证sh test.shsource ./test.sh运行代码时从当前目录中的文件,source test.sh可能完全运行不同的脚本。 source test.sh只有在./test.sh首先找不到test.sh时才会PATH运行。

答案 1 :(得分:1)

当您运行source test.sh时,不会创建新的shell,因此程序${0}是bash。当您运行sh test.sh时,bash会创建一个新shell,并将${0}设置为脚本名称。