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

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator


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

#1 楼

在这种情况下,点表示将文件的内容“来源”到当前的shell中。使用source本身是shell内置命令。并且source和点运算符是同义词。

示例

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

$ cat sample.sh 
echo "hi"
echo "bye?"


现在当我获取它时:

$ . sample.sh 
hi
bye?
$


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

示例

说我在另一个文件addvars.sh中有这些命令。

$ cat addvars.sh 
export VAR1="some var1 string"
export VAR2="some var2 string"


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

$ env | grep VAR
$


现在当我获得此文件时:

$ . addvars.sh 
$


确定,似乎没有执行任何操作,但是当我们再次检查env变量时:

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string


#2 楼

要补充slm的答案,请执行以下操作:

有两种运行Shell脚本的方法。一种是在单独的进程中运行脚本,这意味着在运行“子” shell进程之前,所有有关shell环境(内存状态)的信息都会还原为“父” shell的状态。

例如,当前工作目录(文件系统所在的位置)在每个进程的基础上确定。因此,让我们有一个如下所示的脚本:

#!/bin/bash
cd ~
cd ..
pwd


所以,我们将此脚本称为foo。让我们按以下方式运行此脚本:./foo

我们将看到以下内容:

/home


(标准免责声明中存在大量Linux和其他UNIX克隆发行版,其中有些没有将用户目录放在/home中。或者,就像我们以前所说的“您的里程可能会有所不同”)。

现在,运行此脚本后,让我们键入以下命令

pwd


要查看我们所在的目录。我们将看到类似这样的内容:

/home/username


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

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

. ./foo


或者等效地:

source ./foo


如果我们做一个之后,我们将看到以下内容:

/home


原因是:采购脚本不会调用单独的进程。就像手动键入父进程中的所有命令一样;脚本结束后将保留其环境。


让我提出一个更简单的示例。让我们编写一个如下所示的脚本:

#!/bin/bash
exit


将其命名为pwd。让我们确保我们可以运行它:foo。然后,让我们这样运行它:

./foo


没发生什么事。但是,另一方面,如果执行此操作:

. ./foo


或此方法:

source ./foo


我们注销。

评论


您的回答比接受的要好,我理解您的解释,谢谢!

–艾哈迈德(Ahmed)
16年7月25日在13:03

邓达达杜乌恩! (请打鼓)……这里最重要的短语是!:原因是:采购脚本并没有调用单独的过程。就像手动键入父进程中的所有命令一样;脚本结束后,将保留其环境。

–加百利·斯台普斯
19-10-25在2:36



您应该以第二个示例为准。它包含更多的冲击力。

–单线程
19-10-29在14:11

#3 楼

句点(点)是source中内置的bash的简写形式。它将从当前环境中的文件中读取并执行命令,并返回上一次执行的命令的退出状态。这些文件可以位于当前目录中,也可以位于PATH中的任何位置。它不需要是可执行文件。

评论


“文件可以在当前目录中,也可以在PATH中的任何位置”。无论文件在整个文件系统中的何处,都可以为文件提供嗡嗡声,您只需提供它的完整路径即可。

–Â Atralb
20年4月12日在11:21

#4 楼

TL; DR

点与源命令相同。

source是Unix命令,它对命令后的文件进行评估,作为命令列表,在以下位置执行当前上下文。

摘录自
https://en.wikipedia.org/wiki/Source_(command)

评论


欢迎来到U&L!该答案重复了已被接受的答案中的信息,并且实际上没有添加任何内容。

– JigglyNaga
18/12/13在17:06

方面,尽管从技术上讲Jiggly是正确的-这个答案简洁明了,可以帮助我更轻松地理解

– StayCool
20年7月9日在15:46

JigglyNagga欢迎使用TL; DR的含义。简洁也是信息的重要组成部分。这是对我有帮助的信息,这就是我发布该信息以帮助人们寻找更简洁答案的原因。像我以前一样

– mochomecha
20年7月13日在23:05

#5 楼

如何查找。
# type .
. is a shell builtin

# help .
.: . filename [arguments]
    Execute commands from a file in the current shell.

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.

    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.


评论


我认为手册中缺少逗号。它应显示为“在当前Shell中从文件执行命令。”

–ctrl-alt-delor
19年1月2日,11:33

#6 楼

。 (源或点运算符)
从当前Shell上下文中的filename参数读取并执行命令。

Syntax
      . filename [arguments]

      source filename [arguments]


source是点/句号的同义词' 。”在bash中使用,但在POSIX sh中不使用,因此为了获得最大的兼容性,请使用句点。

使用源运行脚本时,该脚本在现有的Shell中运行,该脚本创建或修改的任何变量将保持可用脚本完成后。相反,如果脚本仅以文件名的形式运行,则将生成一个单独的子shell(具有一组完全独立的变量)来运行该脚本。

通过运行.ss64script(点ss64script)和执行脚本来执行脚本之间存在细微的差别。 ss64script(点空间ss64script)

第一个运行的是被'ls'命令隐藏的文件,(尽管ls -a将显示隐藏的文件)第二个选项将执行ss64script,即使它具有尚未使用chmod设置为可执行文件。