在bash,创建变量时。什么时候出口什么时候不出口?
In bash, when creating Variables. When to export and when not to export?
根据我的阅读,假设 export 所做的唯一事情就是使变量对子进程可见是否正确?
在什么情况下您希望使变量仅对其初始化的作用域可见,在什么情况下您希望变量对所有子作用域可用?
一般来说,您只需要导出一个变量,另一个进程将在其环境中查找该变量。你怎么知道那些是哪些变量?你必须阅读他们的文档。
一个变量是否被标记为导出使得无与当前shell。
不同
我们来构建一个演示。
$ printf 'echo "foo=$foo"\n' > script
$ bash script
foo=
$ foo=3
$ bash script
foo=
$ export foo
bash script
foo=3
第一次和第二次你运行script
,foo
在它的环境中是未定义的,因为它的父进程(当前shell) 没有导出 foo
。第三次调用时,父级将 foo
添加到脚本的初始环境,因为 foo
已导出。
针对您的评论,"environment" 一词在这里具有非常精确的含义。 所有 进程,而不仅仅是 shells,在启动时从其父进程(称为其环境)接收字符串数组。这些字符串没有特定的语义;如何解释它们取决于接收程序。
例如,shell 会忽略其环境中不具有 name=value
形式的字符串,其中 name
是有效的 shell 标识符。对于每个这样的字符串,shell 定义一个具有给定名称和值的 shell 变量,并标记其导出属性。这就是我们所说的环境变量。您也可以随时使用 export
命令 "promote" 一个常规 shell 变量到环境变量,但这不会影响当前进程中变量的含义。
当任何进程创建新进程时,都会将其环境的副本提供给新进程。 shell 还创建了 name=value
字符串以从其每个环境变量传递。
根据我的阅读,假设 export 所做的唯一事情就是使变量对子进程可见是否正确?
在什么情况下您希望使变量仅对其初始化的作用域可见,在什么情况下您希望变量对所有子作用域可用?
一般来说,您只需要导出一个变量,另一个进程将在其环境中查找该变量。你怎么知道那些是哪些变量?你必须阅读他们的文档。
一个变量是否被标记为导出使得无与当前shell。
不同我们来构建一个演示。
$ printf 'echo "foo=$foo"\n' > script
$ bash script
foo=
$ foo=3
$ bash script
foo=
$ export foo
bash script
foo=3
第一次和第二次你运行script
,foo
在它的环境中是未定义的,因为它的父进程(当前shell) 没有导出 foo
。第三次调用时,父级将 foo
添加到脚本的初始环境,因为 foo
已导出。
针对您的评论,"environment" 一词在这里具有非常精确的含义。 所有 进程,而不仅仅是 shells,在启动时从其父进程(称为其环境)接收字符串数组。这些字符串没有特定的语义;如何解释它们取决于接收程序。
例如,shell 会忽略其环境中不具有 name=value
形式的字符串,其中 name
是有效的 shell 标识符。对于每个这样的字符串,shell 定义一个具有给定名称和值的 shell 变量,并标记其导出属性。这就是我们所说的环境变量。您也可以随时使用 export
命令 "promote" 一个常规 shell 变量到环境变量,但这不会影响当前进程中变量的含义。
当任何进程创建新进程时,都会将其环境的副本提供给新进程。 shell 还创建了 name=value
字符串以从其每个环境变量传递。