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
相关产品推荐
相关产品推荐

