Bash 什么是;“出口”;你喜欢shell编程吗?

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 提供的名称被标

就我所知,变量赋值是相同的,不管它是否前面有“export”。它的作用是什么?

它使分配对子流程可见

$ 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
进程从获取值e> MYSQL_PWDenv var,但没有“可用于其他程序”的概念==默认情况下仅可用于当前进程的子进程。因为安全性。不适用于任何其他进程。除非他们有权使用所述环境检查进程(例如,使用同一用户或以root用户身份运行的调试器。例如,作为root用户,您可以读取进程1的环境:
cat/proc/1/environ
gives
HOME=/TERM=linuxBOOT\u IMAGE=/vmlinuz-4.19.9-300.fc29.x86_64LANG=en_GB.UTF-8
或类似内容。请参阅此视频: