shell中命令前的点是什么意思?

Jic*_*hao 130 shell

在遵循 android eclipse 调试教程时,我遇到了以下命令。

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator
Run Code Online (Sandbox Code Playgroud)

我的问题是前面的点是什么build/envsetup.sh意思?

slm*_*slm 121

该上下文中的点表示将该文件的内容“来源”到当前 shell 中。随着source本身是内置命令外壳。And source和点运算符是同义词。

例子

假设我在sample.sh文件中有以下内容。

$ cat sample.sh 
echo "hi"
echo "bye?"
Run Code Online (Sandbox Code Playgroud)

现在,当我找到它时:

$ . sample.sh 
hi
bye?
$
Run Code Online (Sandbox Code Playgroud)

诸如此类的文件通常用于合并设置命令,例如向环境变量添加内容。

例子

假设我在另一个文件中有这些命令,addvars.sh.

$ cat addvars.sh 
export VAR1="some var1 string"
export VAR2="some var2 string"
Run Code Online (Sandbox Code Playgroud)

请注意,我当前的 shell 环境中没有任何变量。

$ env | grep VAR
$
Run Code Online (Sandbox Code Playgroud)

现在,当我获取此文件时:

$ . addvars.sh 
$
Run Code Online (Sandbox Code Playgroud)

好吧,它似乎没有做任何事情,但是当我们env再次检查变量时:

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
Run Code Online (Sandbox Code Playgroud)


sam*_*iam 111

添加到 slm 的答案:

有两种方法可以运行 shell 脚本。一种是在单独的进程中运行脚本,这意味着在运行“子”shell 进程之前,有关 shell 环境(内存状态)的任何内容都将恢复到“父”shell 的状态。

例如,当前工作目录(文件系统中的位置)是在每个进程的基础上确定的。所以,让我们有一个看起来像这样的脚本:

#!/bin/bash
cd ~
cd ..
pwd
Run Code Online (Sandbox Code Playgroud)

所以,让我们调用这个脚本,哦,foo。让我们按如下方式运行这个脚本:./foo

我们将看到以下内容:

/home
Run Code Online (Sandbox Code Playgroud)

(标准免责声明,那里有大量的 Linux 和其他 UNIX 克隆发行版,其中一些没有将用户的目录放在/home.

现在,在运行这个脚本之后,让我们输入这个命令

pwd
Run Code Online (Sandbox Code Playgroud)

要查看我们在哪个目录中。我们将看到如下内容:

/home/username
Run Code Online (Sandbox Code Playgroud)

再次,原因是我们运行的 shell 脚本有它自己的环境(包括它自己的运行命令的目录),一旦脚本完成运行,该环境就消失了。

现在,让我们foo像这样运行脚本

. ./foo
Run Code Online (Sandbox Code Playgroud)

或者,等效地:

source ./foo
Run Code Online (Sandbox Code Playgroud)

如果我们pwd之后再做,我们会看到:

/home
Run Code Online (Sandbox Code Playgroud)

原因是:获取脚本不会调用单独的过程。这就像手动键入父进程中的所有命令一样;它的环境在脚本结束后被保留。


让我想出一个更简单的例子。让我们有一个看起来像这样的脚本:

#!/bin/bash
exit
Run Code Online (Sandbox Code Playgroud)

让我们命名它foo。让我们确保我们可以运行它chmod 755 foo。然后,让我们像这样运行它:

./foo
Run Code Online (Sandbox Code Playgroud)

没发生什么事。但是,另一方面,如果我们这样做:

. ./foo
Run Code Online (Sandbox Code Playgroud)

或这个:

source ./foo
Run Code Online (Sandbox Code Playgroud)

我们登出。

  • 你的回答比接受的好,我明白你是怎么解释的,谢谢! (17认同)
  • Dun-da-da-duuuun!(请打鼓)...这里最重要的一句话是!:**原因是:获取脚本不会调用单独的过程。这就像手动键入父进程中的所有命令一样;它的环境在脚本结束后被保留。** (4认同)
  • 你应该用第二个例子来引导。它包含更多的冲击力。 (2认同)

小智 8

句点(点)是内置 bash 的简写source。它将从当前环境中的文件中读取和执行命令,并返回最后执行的命令的退出状态。这些文件可以在当前目录中,也可以在PATH. 它不需要是可执行的。