Bash 什么是;“出口”;你喜欢shell编程吗?
就我所知,变量赋值是相同的,不管它是否前面有“export”。它的作用是什么?它使分配对子流程可见Bash 什么是;“出口”;你喜欢shell编程吗?,bash,shell,zsh,Bash,Shell,Zsh,就我所知,变量赋值是相同的,不管它是否前面有“export”。它的作用是什么?它使分配对子流程可见 $ foo=bar $ bash -c 'echo $foo' $ export foo $ bash -c 'echo $foo' bar 嗯,这通常取决于外壳。对于bash,它将变量标记为“exportable”,这意味着它将显示在您运行的任何子进程的环境中 非导出变量仅在当前进程(shell)中可见 从bash手册页: 导出[-fn][name[=word]]… 导出-p 提供的名称被标
$ foo=bar
$ bash -c 'echo $foo'
$ export foo
$ bash -c 'echo $foo'
bar
嗯,这通常取决于外壳。对于
bash
,它将变量标记为“exportable”,这意味着它将显示在您运行的任何子进程的环境中
非导出变量仅在当前进程(shell)中可见
从bash
手册页:
导出[-fn][name[=word]]…
导出-p
提供的名称被标记为自动导出到随后执行的命令的环境中 如果给出了
-f
选项,则名称表示函数。如果未给出名称,或者提供了-p
选项,则会打印在此外壳中导出的所有名称的列表
-n
选项会导致从每个名称中删除导出属性
如果变量名后面跟有=word
,则该变量的值设置为word
export
返回退出状态0,除非遇到无效选项,其中一个名称不是有效的外壳变量名称,或者-f
附带的名称不是函数
您还可以使用
typeset
命令将变量设置为可导出,并使用set-a
自动标记所有未来的变量创建或修改,导出的变量(如$HOME
和$PATH
)可供导出它们的shell运行的其他程序使用(继承)(以及其他程序运行的程序等)作为环境变量。常规(非导出)变量对其他程序不可用
$ env | grep '^variable='
$ # No environment variable called variable
$ variable=Hello # Create local (non-exported) variable with value
$ env | grep '^variable='
$ # Still no environment variable called variable
$ export variable # Mark variable for export to child processes
$ env | grep '^variable='
variable=Hello
$
$ export other_variable=Goodbye # create and initialize exported variable
$ env | grep '^other_variable='
other_variable=Goodbye
$
有关更多信息,请参阅GNU Bash手册中的条目,以及上和的部分
请注意,非导出变量将可用于通过(…)
和类似符号运行的子shell,因为这些子shell是主shell的直接克隆:
$ othervar=present
$ (echo $othervar; echo $variable; variable=elephant; echo $variable)
present
Hello
elephant
$ echo $variable
Hello
$
子shell可以更改任何变量(无论是否导出)的自身副本,并且可能会影响它运行的进程所看到的值,但是子shell的更改当然不会影响父shell中的变量
有关子shell的一些信息可以在Bash手册下和中找到。我添加了一些新行,以及仅显示
$
的行,以更清楚地显示grep
命令没有输出。当然,如果您认为这会失去可读性,请随时回滚。请注意,非导出变量将可用对子shell是-因为它们被复制以供子shell使用。因此,子shell中的任何修改都不会产生任何效果,因为从子shell返回时会删除副本:。环境变量也会发生同样的情况:被复制-但对于任何类型的子进程,不仅仅是子shell。因此mysql
进程从cat/proc/1/environ
givesHOME=/TERM=linuxBOOT\u IMAGE=/vmlinuz-4.19.9-300.fc29.x86_64LANG=en_GB.UTF-8
或类似内容。请参阅此视频: