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


74

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

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

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

Answers:


78

在这种情况下,点表示将文件的内容“来源”到当前外壳中。随着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 
$

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

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

70

要添加到slm的答案中:

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

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

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

因此,我们将此脚本称为哦foo。让我们如下运行该脚本:./foo

我们将看到以下内容:

/home

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

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

pwd

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

/home/username

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

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

. ./foo

或者,等效地:

source ./foo

如果我们pwd随后进行,将看到以下内容:

/home

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


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

#!/bin/bash
exit

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

./foo

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

. ./foo

或这个:

source ./foo

我们登出。


6
您的回答比接受的要好,我理解您的解释,谢谢!
艾哈迈德

5

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


1

如何找出。

# 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

1

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

Syntax
      . filename [arguments]

      source filename [arguments]

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

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

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

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

资源


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.