2009-05-28 102 views
19

在unix命令行中,通过简单键入名称来执行程序与通过键入a执行程序之间有什么区别。 (点)后跟程序名?例如为:unix命令行执行。 (dot)vs. without

runme 

. runme 
+0

如果我在PuTTy终端中执行第二个操作,它会关闭... – schnaader 2009-05-28 19:10:44

+0

相关:http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script -and-sourcing-a-bash-scrip/176788#176788 – lesmana 2011-12-04 18:34:53

回答

24

. name将源文件称为name放入当前shell。所以,如果一个文件中包含该

A=hello 

然后,如果你来源,事后你可以参考一个叫A变量,它包含你好。但是,如果你执行该文件(给予适当的执行权限和#!/interpreter线),那么这样的事情是行不通的,因为变量和其他的东西,剧本集将仅影响子shell它在运行。

采购一个二进制文件没有任何意义:Shell不会知道如何解释二进制文件(记住它将该文件中出现的东西插入到当前shell中 - 就像C中旧的#include <file>机制一样)。例如:

head -c 10 /dev/urandom > foo.sh; . foo.sh # don't do this at home! 
bash: �ǻD$�/�: file or directory not found 

执行的二进制文件,但是,做当然有很大的意义。所以通常你只想命名你想要执行的文件,在特殊情况下,比如上面的A=hello,你想要一个文件。

15

使用 “source” 或 “.” 导致的命令在当前的进程中运行。将脚本作为可执行文件运行会为其提供自己的进程。

如果你想设置在当前的shell(你不能在一个单独的进程做的)环境变量或要中止脚本不中断你的shell(您可以在一个只有做这个最重要单独的过程)。

+0

该流程的区别为我澄清了一切。 – Kvass 2013-12-18 17:37:25

5

第一个执行命令。第二个是在另一个脚本中包含shell脚本的简写。

4

此语法用于“加载”并解析脚本。当你有一个脚本与一堆其他脚本有共同的功能时,它是非常有用的,你可以“点包含”它。有关详细信息,请参阅http://tldp.org/LDP/abs/html/internal.html(向下滚动到“点”命令)。

4

运行“runme”会创建一个新的进程,它将以很小的方式进行并且不会影响你的shell。

运行“。runme”将允许脚本“runme”更改您的环境变量,更改目录以及您可能希望为其执行的各种其他操作。它只能这样做,因为它正在被已经为你运行的shell进程解释。因此,如果您将bash作为登录shell运行,则只能使用“。”。带有bash脚本的符号,而不是(例如)C shell脚本中的二进制文件。