我进行了网络搜索并阅读了几篇有关在 bash 中使用变量的文章,包括维基百科但无法理解为什么在 bash 中运行FOO_VARIABLE=foo;./test
不会导致测试$FOO_VARIABLE
具有foo
:
默认情况下,创建进程时,它会继承其父进程的重复环境,但父进程在创建子进程时所做的显式更改除外。
还读过:环境变量继承的异常
“除了显式更改”:FOO_VARIABLE=foo ./test
- 导致test
脚本知道FOO_VARIABLE
,但为什么在第一种方式中它不知道?
echo $0
-bash
cat ./test
echo $MY_TEST
MY_TEST=test$MY_TEST
echo $MY_TEST
MY_TEST=ret;./test
test
在 CentOS 7 和 Mac 操作系统上进行了测试。
添加:
https://stackoverflow.com/questions/9772036/pass-all-variables-from-one-shell-script-to-another
第二种方法是获取源代码(从第一个脚本调用第二个脚本),然后不需要export
- 为什么我的情况不同?
修改上面的内容:这是我的匆忙,不太注重细节:我错过了.
在采购部分错过了(点),现在我已经阅读了:https://superuser.com/questions/176783/what-is-the-difference- Between-executing-a-bash-script-vs-commerce-it这部分都很清楚。
https://askubuntu.com/questions/26318/environment-variable-vs-shell-variable-whats-the-difference 是的,我的是本地的,但为什么不通过继承(fork 调用)传递?
答案1
在第一个命令中,
FOO_VARIABLE=foo;./test
您为 shell 变量分配FOO_VARIABLE
一个值。然后你打电话./test
。由于FOO_VARIABLE
未导出,因此它不是环境变量,因此不会被您运行的任何脚本或程序继承。这就是为什么./test
不知道变量的原因。
简而言之:您在“此处”设置了 shell 变量,但它在“那里”不可用(在 中./test
)。
在另一个命令中,
FOO_VARIABLE=foo ./test
FOO_VARIABLE
您在 的环境中设置 的值(即您创建一个名为 的./test
环境变量)。该变量在当前环境中既不设置为环境变量,也不设置为 shell 变量,仅适用于运行 所产生的进程。./test
FOO_VARIABLE
./test
简而言之:您将环境变量设置为“那里”(在 中./test
),而不是“此处”。
如果您FOO_VARIABLE
希望脚本或程序继承一个现有变量作为环境变量,则必须使用export
它,即从中创建一个环境变量:
FOO_VARIABLE=foo
export FOO_VARIABLE
./test
或者,更短
export FOO_VARIABLE=foo
./test
这会在本地设置变量并使其在任何创建的进程中可用(./test
例如)。
答案2
因为此时它不是一个环境变量,而是一个 shell/局部变量。你需要export MY_TEST
它才能发挥作用。另一种选择是这样的:
env MY_TEST=ret ./test
(在 Bash 中也简单地MY_TEST=ret ./test
,但是和 env
跨 shell 更便携。)
顺便说一句,您也可以通过将您的替换为 来验证这./test
一点env|grep MY_TEST
。
在 Bash(但不是所有其他 shell)中,你也可以说
在这种情况下,在 shell 提示符下执行它与您在脚本中执行的操作等效。
使用:
export MY_TEST=ret; env|grep MY_TEST
来验证我写的内容。
假设./test
是一个 shell 脚本(具有相同的 shell 方言),您也可以使用
source ./test
...将所有语句放入./test
当前 shell 中。 shell/局部变量也将是可见的,因为您实际上并没有启动另一个进程。
子 shell 有自己的设置(例如 shell 选项和工作目录),但从技术上讲,它在同一进程中运行。所以没有fork()
参与。如果有fork()
命令行参数并且环境变量将是将内容传递给其他脚本/可执行文件的方法。
它与子 shell 继承父 shell 的 shell/局部变量的情况不同:
TEST=ret; (echo "shell variable=$TEST"; env|grep TEST)
这里是子shell(内部(...)
)将要查看该变量,但它仍然不是环境变量。