Answers:
采购脚本将在当前的 shell进程中运行命令。
执行脚本将在新的 Shell进程中运行命令。
如果您希望脚本更改当前正在运行的Shell中的环境,请使用source。否则执行。
如果您仍然感到困惑,请继续阅读。
为了澄清关于执行语法和源语法的一些常见混淆:
./myscript
只要该文件是可执行文件并且位于当前目录中,它将执行 myscript
。前导点和斜杠(./
)表示当前目录。这是必需的,因为当前目录通常不在中(并且通常不应该在中)$PATH
。
myscript
如果该文件是可执行文件并且位于中的某个目录中,则将执行 myscript
此操作$PATH
。
source myscript
这将源 myscript
。该文件不必是可执行文件,但必须是有效的Shell脚本。该文件可以位于当前目录中,也可以位于中的目录中$PATH
。
. myscript
这也将源 myscript
。此“拼写”是POSIX定义的官方拼写。Bash定义source
为点的别名。
考虑myscript.sh
以下内容:
#!/bin/sh
# demonstrate setting a variable
echo "foo: "$(env | grep FOO)
export FOO=foo
echo "foo: "$(env | grep FOO)
# demonstrate changing of working directory
echo "PWD: "$PWD
cd somedir
echo "PWD: "$PWD
首先执行脚本之前,请检查当前环境:
$ env | grep FOO
$ echo $PWD
/home/lesmana
该变量FOO
未定义,我们位于主目录中。
现在我们执行文件:
$ ./myscript.sh
foo:
foo: FOO=foo
PWD: /home/lesmana
PWD: /home/lesmana/somedir
再次检查环境:
$ env | grep FOO
$ echo $PWD
/home/lesmana
FOO
未设置变量,工作目录未更改。
脚本输出清楚地表明已设置了变量并更改了目录。之后的检查表明未设置变量且目录未更改。发生了什么?所做的更改是在新的外壳中进行的。在当前 shell产生一个新的 shell来运行该脚本。该脚本在新的Shell中运行,对环境的所有更改都在新的Shell中生效。脚本完成后,新外壳将销毁。新外壳中对环境的所有更改都将被新外壳破坏。当前外壳中仅打印输出文本。
现在我们源文件:
$ source myscript.sh
foo:
foo: FOO=foo
PWD: /home/lesmana
PWD: /home/lesmana/somedir
再次检查环境:
$ env | grep FOO
FOO=foo
$ echo $PWD
/home/lesmana/somedir
设置了变量FOO,并且工作目录已更改。
采购脚本不会创建新的外壳。所有命令都在当前Shell中运行,对环境的更改在当前Shell中生效。
请注意,在这个简单的示例中,执行的输出与采购脚本相同。并非总是如此。
考虑以下脚本pid.sh
:
#!/bin/sh
echo $$
(特殊变量$$
扩展为当前正在运行的shell进程的PID)
首先打印当前shell的PID:
$ echo $$
25009
源脚本:
$ source pid.sh
25009
执行脚本,注意PID:
$ ./pid.sh
25011
再次来源:
$ source pid.sh
25009
再次执行:
$ ./pid.sh
25013
您可以看到,在执行脚本的同时,源代码脚本在同一进程中运行,每次都会创建一个新进程。该新进程是为执行脚本而创建的新 shell。输入脚本不会创建新的外壳,因此PID保持不变。
采购和执行脚本都会在脚本中逐行运行命令,就像您逐行手动键入那些命令一样。
不同之处在于:
如果您希望脚本更改当前正在运行的Shell中的环境,请使用source。否则执行。
也可以看看:
source myscript.sh
和. myscript.sh
?
执行脚本会在一个单独的子进程中运行它,即,调用一个单独的shell实例来处理脚本。这意味着脚本中定义的任何环境变量等都无法在父(当前)shell中更新。
提供脚本意味着由当前shell本身来解析和执行脚本。就像您键入脚本的内容一样。因此,源脚本不必是可执行的。但是,如果要执行它,它必须是可执行的。
如果您在当前shell中有位置参数,则它们不变。
因此,如果我有一个a.sh
包含以下内容的文件:
echo a $*
而且我会:
$ set `date`
$ source ./a.sh
我得到类似的东西:
a Fri Dec 11 07:34:17 PST 2009
鉴于:
$ set `date`
$ ./a.sh
给我:
a
希望能有所帮助。
source
该命令在当前 shell环境中执行提供的脚本(不是强制执行权限),而在新 shell中执行提供的可执行脚本。./
另外,请检查以下答案,例如:https : //superuser.com/a/894748/432100