我进行了网络搜索,并阅读了几篇关于在 bash 中使用变量的文章,包括wiki,但不明白为什么在 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 OS 上测试。
添加:
https ://stackoverflow.com/questions/9772036/pass-all-variables-from-one-shell-script-to-
另一种方法是源(从第一个调用第二个脚本),然后export
不需要 - 为什么我的情况不同?
修改至上述内容:这是我的匆忙,对细节不太关注:我.
在采购部分错过了(点),现在我已经阅读:https ://superuser.com/questions/176783/what-is-the-difference- between-executing-a-bash-script-vs-sourcing-it,那部分很清楚。
https://askubuntu.com/questions/26318/environment-variable-vs-shell-variable-whats-the-difference 是的,我的是本地的,但为什么不通过继承(fork call)传递?
在第一个命令中,
你给 shell 变量
FOO_VARIABLE
赋值。然后你打电话./test
。由于FOO_VARIABLE
未导出,因此它不是环境变量,因此不会被您运行的任何脚本或程序继承。这就是为什么./test
不知道变量的原因。简而言之:您在“这里”设置了 shell 变量,但它在“那里”不可用(在 中
./test
)。在另一个命令中,
FOO_VARIABLE
您在环境中设置 的值(即,您创建一个名为./test
的环境变量)。该变量在当前环境中没有设置为环境变量,也没有设置为shell变量,仅针对运行产生的进程。./test
FOO_VARIABLE
./test
简而言之:您将环境变量设置为“那里”(in
./test
)而不是“这里”。FOO_VARIABLE
如果您希望脚本或程序作为环境变量继承现有变量,则必须使用export
它,即从中创建一个环境变量:或者,更短
这会在本地设置变量并使其在任何创建的进程中可用(
./test
例如)。因为此时它不是环境变量,而是外壳/局部变量。你需要
export MY_TEST
它才能工作。另一种选择是:(在 Bash 中也很简单
MY_TEST=ret ./test
,但withenv
在 shell 中更便携。)顺便说一句,您也可以通过将您的替换
./test
为env|grep MY_TEST
.在 Bash(但不是所有其他 shell)中,您也可以说
在 shell 提示符下执行它 - 在这种情况下 - 相当于您在脚本中执行的操作。
利用:
验证我写的内容。
假设
./test
你也可以使用一个 shell 脚本(相同的 shell 方言)... 将所有语句从
./test
您当前的 shell 中引入。shell/local 变量也将是可见的,因为您实际上并没有启动另一个进程。子shell 有自己的设置(例如shell 选项和工作目录),但从技术上讲,它运行在同一个进程中。所以没有
fork()
涉及。如果有fork()
命令行参数和环境变量,则可以将内容传递给其他脚本/可执行文件。这与子 shell 继承父 shell 的 shell/局部变量的情况不同:
这里的子shell(内部
(...)
)将看到变量,但它仍然不是环境变量。