如何通过makefile在Ubuntu中创建和设置系统范围的环境变量?

如何通过makefile在Ubuntu中创建和设置系统范围的环境变量?,makefile,environment-variables,Makefile,Environment Variables,我正在尝试创建一个系统范围的环境变量测试。 我想在执行makefile而不注销和重新启动后立即使用它。所以我试图重复手动操作,比如导出变量并将其写入ti/etc/environment 我写了一个这样的makefile,但它不起作用: var_value := some_string TEST_ENV_ONE := $(var_value) vars: $(shell export TEST_ENV_ONE=$(var_value)) grep 'TEST_ENV_ONE='

我正在尝试创建一个系统范围的环境变量测试。 我想在执行makefile而不注销和重新启动后立即使用它。所以我试图重复手动操作,比如导出变量并将其写入ti/etc/environment

我写了一个这样的makefile,但它不起作用:

var_value := some_string
TEST_ENV_ONE := $(var_value)

vars:
    $(shell export TEST_ENV_ONE=$(var_value))
    grep  'TEST_ENV_ONE=' /etc/environment || "TEST_ENV_ONE=\"$(var_value)\"" | sudo tee -a /etc/environment > /dev/null

正如您所说,在POSIX系统上,您想要做的基本上是不可能的。进程的环境是从启动它的父进程继承而来的,一旦进程正在运行,它的环境就不能从外部更改。通过其子文件或通过修改其他文件包含

您可以通过修改/etc/environment来更改新登录的环境,但这不会更改任何现有shell或其子shell的环境

也就是说,您的makefile还存在许多问题:

$(shell export TEST_ENV_ONE=$(var_value))
这是双重的错误。首先,使用make$shell是一种反模式。。。函数在配方脚本中运行。食谱已经是shell脚本了,所以它是无用的,使用$shell可能会导致意外行为。。。和他们在一起

其次,这是一个不可操作的操作:它所做的是启动一个shell,告诉shell设置一个环境变量并将其导出,然后shell退出。当shell退出时,对其环境的所有更改都会明显丢失,因为它退出了!所以这没什么作用

下一步:

这不起任何作用,因为语句TEST\u ENV\u ONE=\$var\u value\设置了一个环境变量,但不生成任何输出,因此sudo tee命令没有输入,也不会发生任何事情。我想你忘了这里的echo命令:

grep  'TEST_ENV_ONE=' /etc/environment || echo TEST_ENV_ONE=\"$(var_value)\" | sudo tee -a /etc/environment > /dev/null

然而,正如我上面提到的,修改/etc/environment只会对系统的新登录生效,它不会修改任何现有的登录或shell。

正如@madsciient在他的回答中所指出的,在POSIX即类UNIX的操作系统上,您试图做的是不可能的。还有,你到底为什么要使用makefile来完成这个任务?如果你所尝试的是可能的,那么仅仅通过一个脚本就简单多了。除了你所有的其他观点之外,我还想知道他们为什么要使用makefile来完成这个任务。作为一个简单的脚本或函数要简单得多;假设env变量按照他们希望的方式工作。不可能这么说,但可以假设他们想要设置的值不是真正的静态字符串,而是特定于给定make调用的值。但是正如你所建议的,这里几乎没有足够的信息来猜测实际需求是什么。
grep  'TEST_ENV_ONE=' /etc/environment || echo TEST_ENV_ONE=\"$(var_value)\" | sudo tee -a /etc/environment > /dev/null