我使用 Ubuntu 作为 WSL2 的首选 Linux 发行版。我想创建一个在所有用户中都有效的环境变量。
我已经尝试了很多答案,但都不起作用。它们在虚拟机上有效,但在 WSL 下无效。例如,我已经尝试了这个问题的所有答案https://askubuntu.com/questions/161924/how-do-i-set-persistent-environment-variables-for-root。我的目标是从命令提示符运行wsl echo $FOO
并且它的工作方式与作品一样wsl echo $USER
。。
此外,wsl 默认用户需要是 root。
无论如何,以下是我根据所有答案和研究采取的步骤。
- 启用 root 用户,每次我运行 ubuntu 时都以 root 用户身份启动
# First enable root user on Ubuntu by running this on ubuntu wsl:
sudo passwd root
# enter password etc...
# Then set that user as the default user. On command prompt run:
Ubuntu config --default-user root
- 将环境变量 FOO 放置在以下
/etc/environment
位置:
FOO="TRUE"
重新启动计算机以使更改生效
打开 ubuntu 并运行
echo $FOO
。这不会显示任何内容。如果我将用户切换到 tono(例如使用)su tono
,然后运行相同的命令,它就会起作用。我做了一些研究,并将行从改为on
Defaults env_reset
,这样变量就不会被重置。进行此更改并重新启动计算机仍然不起作用。Defaults !env_reset
/etc/sudoers
我现在修改文件 /root/.bashrc 并在其中添加环境变量。这有效,但前提是我在终端内。如果我从命令提示符运行
wsl echo $FOO
它,则不起作用。
简而言之,我的目标是运行命令wsl echo $FOO
并使其返回 true,就像wsl echo $USER
可以工作一样。我是否必须将该变量的值存储在文件中,因为创建一个对所有用户都有效的环境变量非常复杂?
编辑
我将创建一个文件夹 /env,其中包含所有环境变量。这样我就可以运行
wsl echo "hello $(cat /env/FOO) world"
时间较长,但肯定会有效
答案1
好的,有两个问题。对于环境变量,您可以使用 WSLENV。
对于默认用户,我也是 wsl 新手,不知道如何帮助你。但我的建议是不要依赖 root。
以下是使用 WSLENV 的示例:
#!pwsh
> $env:FOO="asdf"
> $env:WSLENV="FOO"
> wsl echo `$FOO
asdf
在此示例中,我没有持久化环境。如果您想使其持久化,请使用setx.exe
或谷歌搜索基于 GUI 的解决方案。
参考:WSLENV:https://devblogs.microsoft.com/commandline/share-environment-vars-between-wsl-and-windows/
答案2
我将所有环境变量/env/my-env-variables.sh
放在
var1="true"
export var1
var2="false"
export var2
alias my_alias="echo hello-world"
# ...etc
现在在 ~/.bashrc 上我在末尾添加了一行:source /env/my-env-variables.sh
以便它们在我使用 shell 时可以工作。
现在,每次我从 Windows 执行脚本时,我只需要记住包含这些变量:
wsl source /env/my-env-variables.sh ; echo $var1