Bash中.与./的区别:为何执行a.out会出现不同结果?
嘿,这个问题挺典型的,很多刚摸Bash的朋友都会把这俩搞混,我给你拆解明白:
Bash中
. 和 ./ 的核心差异 1. . 是Shell内置命令(别名source)
- 它是Bash自带的命令,核心作用是在当前Shell进程里直接执行目标文件中的命令,完全不会启动新的子Shell。
- 它的处理逻辑很明确:只认纯文本的Shell脚本(比如
.sh后缀的文件,或者没有后缀但内容是Shell命令的文本文件),会把文件内容当成Shell命令逐行解析执行。 - 举个实用场景:如果你写了个设置环境变量的脚本
setup_env.sh,用. ./setup_env.sh执行,设置的变量会直接生效在当前Shell里;要是用普通的./setup_env.sh执行,变量只会在脚本运行的子Shell里生效,当前Shell根本看不到。
2. ./ 是相对路径指定符
- 这根本不是一个命令,而是用来告诉系统“去当前工作目录找目标文件”的路径写法。
./a.out的完整逻辑是:找到当前目录下的a.out文件,检查它的可执行权限,然后根据文件类型调用对应的执行机制。 - 如果目标是二进制文件(比如你用C编译出来的
a.out),内核会通过execve系统调用直接加载运行机器码;如果是Shell脚本,系统会启动对应的Shell进程去解析执行。
为什么 . a.out 报错,./a.out 却能成功?
- 当你敲
. a.out时,Bash的内置.命令会把a.out当成Shell脚本去读,但a.out是二进制机器码文件,完全不是Shell能解析的文本命令,所以Bash直接抛出错误:bash: .: a.out: cannot execute binary file。 - 而
./a.out是直接让系统执行这个合法的二进制可执行文件,内核能识别它的ELF格式,顺利加载运行机器码,自然就成功了。
内容的提问来源于stack exchange,提问作者Dan O'Boyle
相关产品推荐
相关产品推荐

