菜鸟科技网

linux点命令是什么?作用与用法详解

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

linux点命令是什么?作用与用法详解-图1
(图片来源网络,侵删)

我会将 命令的功能分为以下几个主要方面来详细说明:


作为 "执行当前目录下的脚本" 的快捷方式 (最常见用法)

这是 命令最广为人知的用法,它是一个 shell 内建命令(built-in command),用于在当前 shell 中执行一个脚本文件。

语法

. filename [arguments]

或者,为了更清晰,也可以使用 source 命令,它们在绝大多数 shell(如 Bash)中是等价的:

source filename [arguments]

工作原理

  • (点命令): 是 shell 的一个内建命令,意思是 "source"(来源)。
  • source 命令: 功能与 完全相同,但更具可读性。

当你使用 ./script.sh 来执行一个脚本时,系统会创建一个新的子 shell 来运行这个脚本,脚本执行完毕后,这个子 shell 就会关闭,回到父 shell。

linux点命令是什么?作用与用法详解-图2
(图片来源网络,侵删)

而当你使用 或 source 来执行脚本时,脚本会在当前的 shell 环境中直接执行,这意味着:

  • 脚本中定义的变量(export 或非 export 的)在脚本执行后仍然存在于当前 shell 中。
  • 脚本中修改的 shell 设置(如 PATH, PWD 等)会直接影响当前 shell。
  • 脚本中定义的函数也会被加载到当前 shell 中。

主要用途

加载环境变量或配置文件 这是最常见的用途,很多应用或工具(如 Docker, Conda, Python 虚拟环境)会提供一个 activatesetup 脚本来设置环境变量,你必须使用 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 中,直接调用这些函数。

linux点命令是什么?作用与用法详解-图3
(图片来源网络,侵删)

示例:创建并加载函数库

  1. 创建函数库文件 my_functions.sh

    #!/bin/bash
    # my_functions.sh
    greet() {
        echo "Hello, $1! Welcome to the function library."
    }
  2. 在你的主脚本或终端中加载它:

    # 加载函数库
    . ./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 安全上下文。

用法 语法 解释 示例
执行脚本 . filenamesource filename 在当前 shell 中执行脚本,不创建子 shell,用于加载环境和函数。 source ./venv/bin/activate
当前目录 ./filename 表示文件位于当前工作目录下,常用于执行本地可执行文件。 ./my_script.sh
正则表达式 匹配任意单个字符。 grep "gr.y" file.txt
文件权限 (在权限末尾) 表示文件拥有扩展属性(如 SELinux 上下文)。 ls -l -> -rw-r--r--.

希望这个详细的解释能帮助你完全理解 Linux 中 命令的多种用法!

分享:
扫描分享到社交APP
上一篇
下一篇