bash: FOO_VARIABLE=foo;./test 未将 foo 变量传递给测试 - 为什么不继承?

bash: FOO_VARIABLE=foo;./test 未将 foo 变量传递给测试 - 为什么不继承?

我进行了网络搜索并阅读了几篇有关在 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 变量,仅适用于运行 所产生的进程。./testFOO_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(内部(...)将要查看该变量,但它仍然不是环境变量。

相关内容