这个命令虽然只有一个字符,但它在 Linux/Unix 系统中扮演着几个非常重要且完全不同的角色,理解这些角色对于熟练使用命令行至关重要。

我会将 命令的功能分为以下几个主要方面来详细说明:
作为 "执行当前目录下的脚本" 的快捷方式 (最常见用法)
这是 命令最广为人知的用法,它是一个 shell 内建命令(built-in command),用于在当前 shell 中执行一个脚本文件。
语法
. filename [arguments]
或者,为了更清晰,也可以使用 source 命令,它们在绝大多数 shell(如 Bash)中是等价的:
source filename [arguments]
工作原理
- (点命令): 是 shell 的一个内建命令,意思是 "source"(来源)。
source命令: 功能与 完全相同,但更具可读性。
当你使用 ./script.sh 来执行一个脚本时,系统会创建一个新的子 shell 来运行这个脚本,脚本执行完毕后,这个子 shell 就会关闭,回到父 shell。

而当你使用 或 source 来执行脚本时,脚本会在当前的 shell 环境中直接执行,这意味着:
- 脚本中定义的变量(
export或非export的)在脚本执行后仍然存在于当前 shell 中。 - 脚本中修改的 shell 设置(如
PATH,PWD等)会直接影响当前 shell。 - 脚本中定义的函数也会被加载到当前 shell 中。
主要用途
加载环境变量或配置文件
这是最常见的用途,很多应用或工具(如 Docker, Conda, Python 虚拟环境)会提供一个 activate 或 setup 脚本来设置环境变量,你必须使用 source 或 来加载它,否则环境变量只在子 shell 中生效,退出子 shell 后就失效了。
示例:激活 Python 虚拟环境
假设你创建了一个名为 myenv 的虚拟环境,它的激活脚本位于 myenv/bin/activate。
# 错误方式:会创建一个子 shell,激活后立即退出,环境变量未加载 ./myenv/bin/activate # 你会发现自己仍在默认的 Python 环境中 # 正确方式:在当前 shell 中加载激活脚本 source myenv/bin/activate # 或者 . myenv/bin/activate # (myenv) $ <-- 注意提示符变了,表示已激活 # 你在这个 shell 中使用的所有 python 命令都指向 myenv 环境中的版本
加载 shell 函数库
你可以把常用的函数定义在一个文件中(my_functions.sh),然后在需要时将其加载到当前 shell 中,直接调用这些函数。

示例:创建并加载函数库
-
创建函数库文件
my_functions.sh:#!/bin/bash # my_functions.sh greet() { echo "Hello, $1! Welcome to the function library." } -
在你的主脚本或终端中加载它:
# 加载函数库 . ./my_functions.sh # 现在可以直接调用 gree t 函数 greet "Alice" # 输出: Hello, Alice! Welcome to the function library.
作为 "当前目录" 的路径名 (文件名前缀)
在文件路径中,单独一个 代表当前工作目录。
语法
./filename
工作原理
当你在命令中输入一个文件名(如 script.sh)时,shell 会在 PATH 环境变量定义的目录列表中寻找这个文件,如果文件不在这些目录中,你需要告诉它文件的确切位置。
就是一种告诉 shell “文件就在当前工作目录下” 的方式。
主要用途
场景:执行位于当前目录下的可执行文件
假设你有一个可执行文件 my_program 在你当前所在的目录 /home/user/projects。
# 切换到目录 cd /home/user/projects # 尝试直接执行(通常会失败,因为当前目录通常不在 PATH 的最前面) $ my_program bash: my_program: command not found # 使用 ./ 明确告诉 shell 在当前目录下寻找 $ ./my_program # 程序成功执行
安全提示:为了安全起见,最好在执行自己目录下的脚本时都使用 前缀,这样可以防止你意外执行到 PATH 中某个目录下可能存在的同名恶意程序,假设你的主目录下有一个叫 ls 的恶意脚本,而你又在主目录下:
# 危险!会执行你当前目录下的恶意 'ls',而不是系统自带的 /bin/ls ls # 安全!明确指定执行系统自带的 /bin/ls /bin/ls
在正则表达式中的特殊含义
在 grep, sed, awk 等文本处理工具中, 是一个强大的正则表达式元字符。
含义
匹配任意单个字符(除了换行符,具体取决于工具和选项)。
示例
# 查找文件中所有包含 "c.t" 的行,'.' 可以是任意字符,如 "cat", "cot", "c3t", "c t" 等 grep "c.t" filename.txt # 查找所有以 "a" 开头,以 "z" 且中间恰好有三个字符的行 grep "^a...z$" filename.txt
在文件权限中的特殊含义
在 ls -l 命令的输出中, 符号出现在文件权限的最后,它表示该文件具有扩展属性。
含义
文件除了标准的读、写、执行权限外,还可以拥有额外的安全属性,如:
- 表示文件有 SELinux 安全上下文。
- 表示文件有 ACLs (Access Control Lists)。
示例
$ ls -l testfile -rw-r--r--. 1 user user 0 Jun 20 10:30 testfile # 注意最后有一个点,表示 testfile 文件启用了 SELinux 安全上下文。
| 用法 | 语法 | 解释 | 示例 |
|---|---|---|---|
| 执行脚本 | . filename 或 source filename |
在当前 shell 中执行脚本,不创建子 shell,用于加载环境和函数。 | source ./venv/bin/activate |
| 当前目录 | ./filename |
表示文件位于当前工作目录下,常用于执行本地可执行文件。 | ./my_script.sh |
| 正则表达式 | 匹配任意单个字符。 | grep "gr.y" file.txt |
|
| 文件权限 | (在权限末尾) | 表示文件拥有扩展属性(如 SELinux 上下文)。 | ls -l -> -rw-r--r--. |
希望这个详细的解释能帮助你完全理解 Linux 中 命令的多种用法!
