#./和#. ./之间的区别是什么?

4

执行脚本的方式有什么区别呢?

# ./test

并且

# . ./test 

测试是一个简单的脚本示例。

#!/bin/bash
export OWNER_NAME="ANGEL 12"
export ALIAS="angelique"

我知道结果,但不确定实际发生了什么。

谢谢。


我不知道你可以做 #。./blah。好的提示。 :) - vhallac
1
如何将 # 作为注释并忽略其后的所有内容!除了文件开头的 #! - Tomas
3个回答

7

./foo 执行的是可执行文件 foo,如果它被标记为可执行文件并且有适当的 shebang 行(或者是 ELF 二进制文件),它将在一个新的进程中执行。

. ./foo 或者 . foo 将脚本加载到当前 shell 中。它等同于 source foo

对于你的示例代码,如果你想让导出的变量在你的 shell 中可用,你需要使用第二种方法。


为什么在第一个场景中环境变量没有被导出呢?我还是很困惑的。 - user1127747
@user1127747:请参考问题Can a shell script set environment variables of the calling shell?中的答案。 - DarkDust
1
因为脚本在自己的进程中运行,所以它无法将东西“返回”到其父环境。这就是环境变量工作的方式。使用source命令(一个孤独的点),可以保持在shell的进程中,并且可以自由更改其环境。 - unwind

2

仅使用点号时,bash会“源”指定的文件。这相当于使用source内置命令,并尝试在同一shell进程中包含和执行脚本。

./启动一个新进程,当前shell进程等待它终止。


3
“./” 表示“在当前目录中”。它是文件路径的一部分,而不是 Bash 语法的一部分,并且不会生成子 shell。 - DarkDust
@DarkDust:可能不太准确,我只是想概括调用脚本而不使用源的情况。 - Blagovest Buyukliev

0
第一个意味着脚本(或二进制文件)是可执行的。脚本中可能包含一个 shebang 行,告诉使用哪个解释器。
第二个是“将 [argument] 作为 shell 脚本执行”的简写。作为参数传递的文件不需要设置可执行位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接