“source”(。)作为shell命令的目的是什么?

这两个命令有什么区别?

. filename # (A) 

 filename # (B) 

这个命令又是如何相关的?

 ./filename # (C) 

注意:#和注释之后的其余部分。

命令(A)被称为源文件,它由shell命令组成。 它不能用于二进制可执行文件(有关如何确定文件types的信息,请参阅man file )。 它会导致文件中的命令在当前环境中执行,就像在shell提示符下键入一样。 结果会影响当前环境,因此可以执行诸如设置环境variables的值和更改目录,添加函数定义等。 没有必要使用chmod来设置执行位。 该文件需要位于当前目录中,或者必须包含完整或相对path*,或者该文件可以位于PATH环境variables中的位置(取决于是否设置了shopt的源PATH选项)。 如果文件所在的位置不需要指定当前目录。 这些都是等价的:

 $ ls filename $ . filename results $ ls /some/directory/filename /some/directory/filename $ . /some/directory/filename results $ cd /elsewhere $ echo $PATH /some/directory $ . filename results 

命令(B)仅在执行位对用户的权限处于打开状态时才使shell执行文件(请参阅man chmod )。 该文件可能是一个shell脚本,二进制可执行文件或其他脚本,如Perl或Python(或写在不同的shell)。 如果名称中没有斜线(没有指定目录),则文件必须位于PATH环境variables中包含的目录中。 可以在path中包含当前目录,但是我不推荐它,因为这是安全风险。 这些是等价的:

 $ echo $PATH /some/directory $ filename results $ /some/directory/filename results 

命令(C)与命令(B)基本相同,但是它指定当前目录,其被称为“。”。 (就像父目录被称为“..”一样,由于指定了一个目录,因此不会searchPATH来定位文件。

[*]相对path是不以斜杠(/)开始的path。 它指定一个相对于当前目录的位置。 “this / is / a / subdir”与“./this/is/a/subdir”(指定相同的目录)一样,作为当前目录下的目录path存在。 “../another/set/of/dirs”是当前父目录下的一组目录。

如果您使用脚本来源

 # . script 

要么

 # source script 

意味着脚本在当前shell中运行。

如果你跑步

 # ./script 

它将运行在一个新的shell中,并且不能访问当前shell中设置的variables,这些variables没有通过“export”导出到环境中。

使用". <executable>"在正在运行的shell的上下文中运行可执行文件。 如果您在脚本中设置了variables,它们将会保留在您从中获取的shell中。

执行程序或脚本时的正常行为是实例化一个新的shell并启动该进程。 (这就是为什么脚本以#!/bin/sh#!/bin/perl -w等开头),它规定了要使用的shell和选项)

“采购”脚本对加载特定于应用程序(通常是数据库或开发环境)的环境variables很有用。 如果您运行多个Oracle或其他数据库实例,则可能有一组用于生产,开发和QA环境的“源”或“环境”脚本。 如果您有一个针对多个平台(即从Linux场生成Solaris二进制文件)的编译服务器场,则可以使用这些脚本轻松加载正确的环境variables。

一个。 。 文件名

在当前上下文中执行脚本文件。 主要用于将variables从shell脚本导出到当前运行的shell。 所以如果在“〜/ .bash_profile”文件中导出一些新的variables,并且我们想要在没有注销的情况下在当前shell中应用修改,我们可以使用命令

 . ~/.bash_profile 

在当前上下文中再次执行“〜/ .bash_profile”并获取导出的新variables。

B.文件名

如果命令存在于searchpath中,那么它将被执行。 如果当前文件夹不包含在searchpath中,则当前文件夹中的命名文件命令不会被执行。 查看当前path使用情况

 echo $PATH 

如果名为“filename”的可执行文件存在于path中的多个文件夹中。 path中第一个列出的文件夹中的可执行文件将被执行。 要查看input“文件名”使用时正在执行的文件的位置

 which filename 

C. /文件名

它用于执行当前工作目录下名为executable的文件。