作为 shell 命令,“source”(.) 的用途是什么?

作为 shell 命令,“source”(.) 的用途是什么?

这两个命令有什么区别?

. 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. ./文件名

它用于执行当前工作目录中存在的名为可执行文件的文件。

相关内容