You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中引用目录时.与./的区别是什么?

在Bash中,. 和 ./ 的核心区别及关联场景

先直接给结论:这俩完全不是一回事——一个是Shell内置命令,一个是路径表示,差异根源在Shell本身,和外部执行的程序(比如cp)关系不大。

1. 本质定义天差地别

  • . (注意后面必须跟空格):这是Bash内置的source命令的别名,作用是在当前Shell进程中执行指定脚本,不会启动子Shell。比如你执行. ./my_config.sh,就是让当前Shell直接加载并运行当前目录下的配置脚本,脚本里设置的环境变量、别名会直接生效在当前会话里,不会随着脚本结束而消失。
  • ./:这是相对路径的标准写法,代表当前工作目录,用来明确指定你要操作的文件/目录就在当前目录下。比如./my_script.sh是运行当前目录下的脚本(这时候会启动子Shell,除非你用source/.);ls ./就是查看当前目录的内容,和ls .效果一致,但写法更明确。

2. 和Shell/外部程序的关联

  • . 是Shell专属特性:它是Bash(以及大部分POSIX兼容Shell)的内置命令,和外部程序无关。不管你后面跟的脚本是什么,都是Shell直接在当前进程里执行,外部程序根本不会参与这个过程。
  • ./是Shell路径解析的环节:当你写./xxx时,是Shell先把这个相对路径解析成完整的绝对路径(比如/home/user/xxx),然后再把解析后的路径传给外部程序(比如cp、ls)。外部程序拿到的是完整路径,它不需要理解./的含义,只需要处理对应的文件系统对象就行。

3. 实际场景对比(包括你提到的cp -r)

场景A:执行脚本

  • 用./test.sh:Bash会启动一个独立的子Shell进程来运行脚本,脚本里修改的环境变量、定义的函数只会存在于子Shell中,脚本结束后当前Shell完全不受影响。
  • 用. ./test.sh:脚本的所有操作都在当前Shell进程中执行,比如脚本里写export MY_VAR=123,执行完后你在当前Shell里直接echo $MY_VAR就能看到123。

场景B:复制目录(cp -r)

  • 写cp -r . ./backup:这里的.代表当前工作目录本身,cp会把当前目录下的所有内容(包括隐藏文件、子目录)复制到当前目录下的backup文件夹里。
  • 写cp -r ./docs ./backup_docs:这里的./docs明确指定当前目录下的docs目录,cp会把这个目录完整复制到当前目录下的backup_docs(如果backup_docs不存在就创建它,如果存在就把docs放到backup_docs里面)。
  • 补充:其实直接写cp -r docs backup_docs和cp -r ./docs backup_docs效果几乎一样,但./的好处是避免歧义——万一你的系统PATH里刚好有个叫docs的命令(虽然概率极低),不加./的话Shell可能会混淆,但加了./就明确告诉Shell:我要找的是当前目录下的docs目录,不是PATH里的命令。

内容的提问来源于stack exchange,提问作者ooxi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:54:48