菜鸟科技网

Linux点命令究竟有何特殊用途?

  1. source 命令:别名是 (点),这是最常见、也最容易被问到的“点命令”。
  2. (点) 命令本身:用于在当前目录下执行脚本。

source 命令 (别名 )

这是最核心、最常用的“点命令”,它的作用是在当前 Shell 环境中读取并执行一个 Shell 脚本文件。

Linux点命令究竟有何特殊用途?-图1
(图片来源网络,侵删)

基本语法

# 使用 source 关键字
source filename [arguments]
# 使用 . (点) 作为别名
. filename [arguments]

source 和 是完全等价的,但 source 更具可读性,而 是一个历史悠久的传统写法。

核心作用:改变当前 Shell 环境

source 命令最关键的特点是:它不是创建一个新的子 Shell 来执行脚本,而是在当前的父 Shell 中执行。

这意味着,脚本中的所有命令(比如变量赋值、函数定义、目录切换 cd、修改环境变量 export 等)都会直接影响到当前的 Shell 会话。


与普通执行( 或直接写文件名)的对比

为了理解 source 的威力,我们首先要了解普通执行方式

Linux点命令究竟有何特殊用途?-图2
(图片来源网络,侵删)
  • 普通执行:当你使用 ./script.sh/path/to/script.sh 执行脚本时,Linux 会创建一个新的子 Shell 来运行这个脚本,脚本执行完毕后,这个子 Shell 就会被销毁,它所做的所有改变(比如变量、cd 目录)都不会影响到父 Shell。

举个例子,你就彻底明白了:

步骤 1:创建一个测试脚本

创建一个名为 test_script.sh 的文件,内容如下:

#!/bin/bash
echo "--- Inside the script ---"
echo "Current PID (Process ID): $$" # $$ 变量显示当前Shell的PID
echo "Original directory: $(pwd)"
# 定义一个变量
MY_VAR="I am set by the script"
# 切换目录
cd /tmp
echo "Changed directory to: $(pwd)"
echo "Script finished."
echo "------------------------"

步骤 2:普通执行()

Linux点命令究竟有何特殊用途?-图3
(图片来源网络,侵删)

打开一个终端,执行:

# 给脚本执行权限
chmod +x test_script.sh
# 普通方式执行
./test_script.sh

输出结果:

--- Inside the script ---
Current PID (Process ID): 12345  <-- 注意这个PID
Original directory: /home/user
Changed directory to: /tmp
Script finished.
------------------------

执行后,立即在同一个终端检查:

echo $MY_VAR
pwd

输出结果:

                                     <-- 变量 MY_VAR 是空的
/home/user                         <-- 当前目录没有改变,仍然是 /home/user

普通执行创建了一个新的子进程(PID 12345),脚本在其中运行并修改了环境,但父进程(你的终端)不受影响。


步骤 3:使用 source 命令执行

我们回到原始的 /home/user 目录,然后使用 source 命令执行同一个脚本:

pwd  # 确认在 /home/user
. test_script.sh  # 或者使用 source test_script.sh

输出结果:

--- Inside the script ---
Current PID (Process ID): 12367  <-- 注意这个PID,和终端的PID一样!
Original directory: /home/user
Changed directory to: /tmp
Script finished.
------------------------

执行后,立即在同一个终端检查:

echo $MY_VAR
pwd

输出结果:

I am set by the script     <-- 变量 MY_VAR 成功设置!
/tmp                       <-- 当前目录真的切换到了 /tmp!

source 命令没有创建新的子进程,它直接在当前的终端 Shell 中执行脚本,脚本对环境的所有改变都永久地保留了下来。


source 的常见用途

  1. 加载环境变量配置文件 这是最经典的应用,很多软件(如 Node.js, Java, Python 虚拟环境)会提供一个 activateenv.sh 文件来设置环境变量和路径,你必须使用 source 来加载它,否则这些变量只在子 Shell 中有效,退出子 Shell 后就失效了。

    # 加载 Python 虚拟环境
    source myenv/bin/activate
    # 加载自定义的环境变量
    source ~/.bashrc  # 或 ~/.profile, ~/.zshrc 等
  2. 加载 Shell 函数库 你可以将常用的函数定义在一个文件中(functions.sh),然后在其他脚本或命令行中通过 source 将其加载进来,直接使用这些函数。

    functions.sh 文件内容:

    #!/bin/bash
    my_function() {
      echo "Hello from my_function!"
    }

    使用:

    # 加载函数库
    . ./functions.sh
    # 现在可以直接调用函数了
    my_function
    # 输出: Hello from my_function!
  3. 重新加载配置文件 修改了 ~/.bashrc~/.zshrc 后,通常需要重新登录才能生效,使用 source 可以在不登出的情况下立即让配置生效。

    source ~/.bashrc

(点) 命令本身 (在当前目录执行)

除了作为 source 的别名, 也是一个独立的命令,其作用是在当前 Shell 环境中执行一个文件

基本语法

. filename [arguments]

这个命令和 source filename 的行为完全一样!它也是 source 命令的一个 POSIX 标准别名,在绝大多数情况下,你看到的 命令都是指 source

历史用法(与 PATH 无关)

在早期或某些特定的 Shell 环境中, 命令还有一个用途:执行当前目录下的脚本,而不需要 前缀

这与你是否将当前目录 添加到了 PATH 环境变量有关。

  • 不在 PATH:你必须使用 ./script.sh 来执行当前目录下的脚本,因为 Shell 默认不会在当前目录查找可执行文件(出于安全考虑)。
  • PATH:理论上你就可以直接输入 script.sh 来执行,但强烈不推荐将当前目录 加入 PATH,因为这可能导致“命令劫持”安全风险(当你在一个恶意目录下时,攻击者可能放置一个同名的 ls 命令,而你无意中执行了它)。

而 命令提供了一种安全的方式来执行当前目录下的脚本,它不依赖于 PATH 变量,总是明确地表示“执行当前目录下的这个文件”。

在现代 Linux 系统中,你几乎可以认为 命令就是 source 命令的同义词,它的“在当前目录执行”的功能已经被 前缀所取代,并且其行为与 source 一致,即在当前 Shell 中执行。


总结与对比

特性 source filename ./filename (普通执行)
别名 (点)
执行环境 当前 Shell (父 Shell) 新的子 Shell
变量影响 永久影响当前 Shell 临时影响,子 Shell 销毁后丢失
cd 目录影响 永久改变当前 Shell 的目录 临时改变,不影响父 Shell
性能 稍快,无需创建新进程 稍慢,需要创建新进程
主要用途 加载配置文件、函数库,使环境变量生效 独立运行一个脚本,不影响当前环境

简单记忆法则:

  • 想让脚本的改变永久生效(比如设置环境变量、切换目录、定义函数),用 source 或 。
  • 想让脚本独立运行,执行完就完事,不影响当前环境,用 。
分享:
扫描分享到社交APP
上一篇
下一篇