出口是干什么用的?

有什么区别:

export name=value

and

name=value

当前回答

导出使子流程可以使用该变量。

也就是说,

export name=value

意味着该变量名可用于从该shell进程运行的任何进程。如果您希望进程使用此变量,请使用export,并从该shell运行该进程。

name=value

意味着变量范围被限制在shell中,并且对任何其他进程都不可用。你可以将它用于(比如说)循环变量、临时变量等。

需要注意的是,导出变量并不会使它对父进程可用。也就是说,在派生的进程中指定和导出一个变量并不会使它在启动它的进程中可用。

其他回答

只是为了显示环境中导出的变量(env)和环境中未导出的变量之间的区别:

如果我这样做:

$ MYNAME=Fred
$ export OURNAME=Jim

那么只有$OURNAME出现在环境中。变量$MYNAME不在环境中。

$ env | grep NAME
OURNAME=Jim

但是变量$MYNAME在shell中确实存在

$ echo $MYNAME
Fred

UNIX的两位创建者Brian Kernighan和Rob Pike在他们的书《UNIX编程环境》中解释了这一点。谷歌的标题,你会很容易找到一个pdf版本。

它们介绍了3.6节中的shell变量,并重点介绍了该节末尾的export命令的使用:

当您想要在子shell中访问变量的值时,应该使用shell的export命令。(您可能会想为什么没有办法将变量的值从子shell导出到父shell)。

Export将使该变量对当前shell派生的所有shell可用。

导出使子流程可以使用该变量。

也就是说,

export name=value

意味着该变量名可用于从该shell进程运行的任何进程。如果您希望进程使用此变量,请使用export,并从该shell运行该进程。

name=value

意味着变量范围被限制在shell中,并且对任何其他进程都不可用。你可以将它用于(比如说)循环变量、临时变量等。

需要注意的是,导出变量并不会使它对父进程可用。也就是说,在派生的进程中指定和导出一个变量并不会使它在启动它的进程中可用。

为了说明其他答案的意思:

$ foo="Hello, World"
$ echo $foo
Hello, World
$ bar="Goodbye"
$ export foo
$ bash
bash-3.2$ echo $foo
Hello, World
bash-3.2$ echo $bar

bash-3.2$