学习linux commands:export

来源:互联网 发布:美国 贫富差距 知乎 编辑:程序博客网 时间:2024/06/06 10:30

介绍

export命令是bash这个shell里的内置命令之一,这意味着它是你的shell的一部分,export命令相当简单,因为它有着简单直接的语法和仅仅三个参数。 大致上,export命令标志着在一个新的forked子进程导出一个环境变量,并且因此允许一个子进程继承所有标记的变量。如果你不明白这是什么意思,这个文章会更详细地解释这个过程。

常用参数

  • -p
    列出所有当前shell里export出的变量的名称

  • -n
    从export列表中移除某个变量

  • -f
    这些变量(names)将是作为函数被export(导出)

基本的export

考虑一下这个例子:

$ a=linuxcareer.com$ echo $alinuxcareer.com //这是有输出哦$ bash$ echo $a     //实际上没有输出哦$

讲解:

  • 第一行:一个叫做“a”的变量,含有字符:linuxcareer.com被创建出来

  • 第二行:使用echo命令打印变量a的内容

  • 第三行: 创建新的子bash shell

  • 第四行: 变量a没有任何的值定义

从上面这个例子里我们可以看到,任何从父进程里fork的子进程默认并没有继承父进程的变量们。这就是为何我们需要export命令。看一下下面这个针对上面例子的改进版本吧:

$ a=linuxcareer.com$ echo $alinuxcareer.com$ export a$ bash$ echo $alinuxcareer.com$

在第三行我们使用了export命令来让a这个变量在新的子进程被创建时被导出。结果就是,a变量是一个仍然保持“linuxcareer.com”字符串的变量。
值得注意的是:为了在新的进程中(bash)仍然保留a这个变量,这个进程(bash)一定是fork的是a被创建的进程。
关于父子进程的关系在下面有解释:

子进程vs父进程

在这个部分我们简单地介绍父子进程之间的关系。任何一个进程都可以同时作为父进程和子进程。 唯一的一个例外就是init这个进程,这个进程一直会有一个1的PID(progress ID)。因此,init进程是所有运行在当前你的linux系统上的进程的老爹。

$ps -p 1 PID TTY      TIME   CMD 1   ?      00:00:02  init

所有进程正常情况下都有一个父进程,在它被创建的地方,它因此会被当作一个父进程的孩子。例如:

$ echo $$27861$ bash$ echo $$28034$ ps --ppid 27861  PID TTY          TIME CMD28034 pts/3    00:00:00 bash

第一行: 打印当前shell的pid 即 27861

第二行: 创建一个子进程,是从pid为27861这个进程创建

第三行: 打印当前shell 的pid 即 28034

第四行:使用ps命令打印pid是27861的子进程的pid (所以有28034在最后一行看到)

当创建一个新的子进程,export命令是用来保证所有父进程里的变量都能在子进程里可用。

使用export命令

我们已经学习了一些export的基本命令,现在探索一些细节把。当你不带任何参数来使用export命令时,它只会简单地输出所有暴露给子进程的变量。这和你使用-p参数是一样的:

$ exportdeclare -x COLORFGBG="15;0"declare -x DEFAULTS_PATH="/usr/share/gconf/cinnamon.default.path"declare -x DESKTOP_SESSION="cinnamon"declare -x DISPLAY=":0".....

正如之前所展示的,要export一个变量我们只需使用那个变量名作为参数,作为export命令的参数。

$ MYVAR=10$ export | grep MYVAR$ export MYVAR$ export | grep MYVARdeclare -x MYVAR="10"

如你所见,一旦MYVAR这个变量被export出去,它就会在被export过的变量列表中出现,另外,上面这个例子也能直接使用export命令来变得短一些。

$export MYVAR=10$export | grep MYVARdeclare -x MYVAR="10"

最常用的export的可能就是用来定义PATH,这是一个shell变量

$export PATH=$PATH:/usr/local/bin

在上面这个例子中,我们把/usr/local/bin包括到了当前的PATH定义中。

从export列表中移除变量(names)

接下来这个例子,我们有MYVAR定义在export列表

$export |grep MYVARdeclare -x MYVAR="10"

移除变量,从export 列表的话,我们应该使用 -n参数。

$ export | grep MYVARdeclare -x MYVAR="10"$ export -n MYVAR$ export | grep MYVAR$
0 0