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