这两个命令有什么区别?
. filename # (A)
和
filename # (B)
这个命令有什么关系?
./filename # (C)
注意:# 和它后面的行的其余部分是注释。
这两个命令有什么区别?
. filename # (A)
和
filename # (B)
这个命令有什么关系?
./filename # (C)
注意:# 和它后面的行的其余部分是注释。
命令 (A) 称为获取由 shell 命令组成的文件。它可能不适用于二进制可执行文件(
man file
有关如何确定文件类型的信息,请参阅 )。它使文件中的命令在当前环境中执行,就好像它们是在 shell 提示符下键入的一样。结果会影响当前环境,因此可以执行诸如设置环境变量的值和更改目录、添加函数定义等操作。不必使用 chmod 设置执行位。该文件需要位于当前目录中,或者必须包含完整或相对路径*,或者该文件可以位于PATH
环境变量中的位置(取决于sourcepath
选项是否shopt
已设置)。如果当前目录是文件所在的位置,则无需指定当前目录。这些都是等价的:命令 (B) 使 shell 仅在执行位为用户权限打开时才执行文件(请参阅 参考资料
man chmod
)。该文件可以是 shell 脚本、二进制可执行文件或其他脚本,例如 Perl 或 Python(或用不同的 shell 编写)。如果名称中没有斜杠(未指定目录),则文件必须位于PATH
环境变量中包含的目录中。可以在路径中包含当前目录,但我不推荐它,因为它存在安全风险。这些是等价的:命令 (C) 本质上与命令 (B) 相同,但它指定了当前目录,称为“.”。(就像父目录称为“..”一样。由于指定了目录,因此不会搜索 PATH 来定位文件。
[*] 相对路径是不以斜杠 (/) 开头的路径。它指定相对于当前目录的位置。“this/is/a/subdir”作为当前路径下的目录路径存在,“./this/is/a/subdir”(指定相同的目录)也是如此。“../another/set/of/dirs”是当前目录的父目录下的一组目录。
如果您使用以下脚本获取脚本
或者
表示脚本在当前 shell 中运行。
如果你跑
它将在新的 shell 中运行,并且无法访问当前 shell 中设置的变量,这些变量尚未通过“export”导出到环境中。
使用在
". <executable>"
运行 shell 的上下文中运行可执行文件。如果您在脚本中设置变量,它们将保留在您从中获取它们的 shell 中。执行程序或脚本时的正常行为是实例化一个新的 shell 并启动该进程。(这就是脚本以 , 等开头的原因
#!/bin/sh
——#!/bin/perl -w
它规定了要使用的 shell 和选项)“采购”脚本对于加载特定于应用程序(通常是数据库或开发环境)的环境变量很有用。如果您运行多个 Oracle 或其他数据库实例,您可能有一组用于生产、开发和 QA 环境的“源”或“环境”脚本。如果您有一个面向多个平台的编译场(即从 Linux 场生成 Solaris 二进制文件),您可能拥有这些脚本来轻松加载正确的环境变量。
一个。 。文件名
在当前上下文中执行脚本文件。主要用于将变量从 shell 脚本导出到当前运行的 shell。因此,如果在“~/.bash_profile”文件中导出一些新变量,并且我们想在当前 shell 中应用更改而不注销,我们可以使用命令
在当前上下文中再次执行“~/.bash_profile”并导出新变量。
B. 文件名
如果命令存在于搜索路径中,那么它将被执行。如果当前文件夹不包含在搜索路径中,则不会执行当前文件夹中名为命令的文件。查看当前路径使用
如果路径中的多个文件夹中存在名为“filename”的可执行文件。将执行路径中第一个列出的文件夹中的可执行文件。要查看在键入“文件名”时执行的文件在哪里,请使用
C../文件名
它用于执行当前工作目录中存在的名为可执行文件的文件。