"source" (.) 作为 shell 命令的目的是什么?

Den*_*son 5 shell

这两个命令有什么区别?

. filename            # (A)
Run Code Online (Sandbox Code Playgroud)

filename              # (B)
Run Code Online (Sandbox Code Playgroud)

这个命令是如何相关的?

./filename            # (C)
Run Code Online (Sandbox Code Playgroud)

注意:# 和它后面的行的其余部分是注释。

Den*_*son 16

命令 (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
Run Code Online (Sandbox Code Playgroud)

命令 (B) 仅在用户权限启用执行位时才使 shell 执行文件(请参阅 参考资料man chmod)。该文件可以是 shell 脚本、二进制可执行文件或其他脚本,例如 Perl 或 Python(或用不同的 shell 编写)。如果名称中没有斜杠(未指定目录),则该文件必须位于PATH环境变量中包含的目录中。可以在路径中包含当前目录,但我不建议这样做,因为它存在安全风险。这些是等效的:

$ echo $PATH
/some/directory
$ filename
results

$ /some/directory/filename
results
Run Code Online (Sandbox Code Playgroud)

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

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

  • 只是说不。在路径中 (7认同)

Dav*_*ley 7

如果您使用以下脚本获取脚本

# . script
Run Code Online (Sandbox Code Playgroud)

或者

# source script
Run Code Online (Sandbox Code Playgroud)

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

如果你跑

# ./script
Run Code Online (Sandbox Code Playgroud)

它将在新 shell 中运行,并且无法访问当前 shell 中设置的变量,这些变量尚未通过“export”导出到环境中。