设想
在从 Windows Powershell 在 WSL Ubuntu 18.04 上实施某些软件的无人值守安装时,apt upgrade
命令返回以下提示:
这个问题很好地解释了可以通过在运行命令之前在 WSL Ubuntu 18.04 中设置环境变量来阻止此提示apt upgrade
。我验证了这确实有效。但是,我在从 Powershell 设置 WSL Ubuntu 18.04 的环境变量时遇到了一些问题。这些问题在“尝试”部分中有详细说明。
问题
如何DEBIAN_FRONTEND=noninteractive
通过 powershell 脚本设置 WSL Ubuntu 18.04 中的环境变量?
平均能量损失
下面包含了一些尝试的 MWE。
# First define path to the installed ubuntu1804.exe
$str1="/Users/"
$str2="/AppData/Local/Microsoft/WindowsApps/ubuntu1804"
$hdd_name=(Get-WmiObject Win32_OperatingSystem).SystemDrive
$username=$env:UserName
[String] $ubuntu1804_path=$hdd_name+$str1+$username+$str2
Write-Host "Done with setup now starting apt update ."
# perfrom apt update
$str1=" run 'yes | apt update'"
$command=$ubuntu1804_path+$str1
invoke-expression -Command $command
Write-Host "Performed Update, now setting env variable."
# set environment variable DEBIAN_FRONTEND=noninteractive
$str1=" run DEBIAN_FRONTEND=noninteractive"
$command=$ubuntu1804_path+$str1
invoke-expression -Command $command
Write-Host "Performed setting env variable, now performing upgrade."
# perfrom apt upgrade
$str1=" run 'yes | apt upgrade'"
$command=$ubuntu1804_path+$str1
invoke-expression -Command $command
Write-Host "Performed upgrade."
尝试
最初,我尝试通过从 WSL 解析来设置环境变量bash -c DEBIAN_FRONTEND=noninteractive
。接下来我尝试了wsl DEBIAN_FRONTEND=noninteractive
。然后我尝试了invoke-expression -Command
MWE 中所述的。所有这些要么挂在提示符上(前 2 个不显示提示符,而是无限期地等待,(我每个都等了 2 小时以上,并验证了 wsl 中的命令本身只需要 +- 30 分钟)),后者转到 powershell 中的提示符:
。
疑虑
我认为这 3 次尝试的观察结果暗示了以下两种情况:
- 我没有
DEBIAN_FRONTEND=noninteractive
从 powershell 正确设置环境变量。 - 或者,powershell
DEBIAN_FRONTEND=noninteractive
在某些 shell 中正确设置了环境变量,但随后为下一个命令打开了一个新的 shell,其中未设置环境变量。
为了验证我是否正确设置了环境变量,我尝试运行wsl printenv
,但是这返回的列表与我printenv
从 wls 运行的列表不同。如果我DEBIAN_FRONTEND=noninteractive
在 wsl 中手动设置环境变量,该printenv
命令会正确显示环境变量。但是,如果我关闭并重新打开 WSL Ubuntu 18.04 并重新运行该printenv
命令,环境变量就会消失。这个观察意味着疑惑的选项 2 是可能的。我还没有找到一种方法来确定环境变量是否从 powershell 中正确设置,因为它不在printenv
powershell 的输出中,而它在 WSL 的输出中printenv
。
答案1
在 git 中搜索包含以下内容的 powershell 脚本后,DEBIAN_FRONTEND=noninteractive
我发现一个例子这表明可以使用以下命令从 powershell 脚本为特定命令指定环境变量:
# First define path to the installed ubuntu1804.exe
$str1="/Users/"
$str2="/AppData/Local/Microsoft/WindowsApps/ubuntu1804"
$hdd_name=(Get-WmiObject Win32_OperatingSystem).SystemDrive
$username=$env:UserName
[String] $ubuntu1804_path=$hdd_name+$str1+$username+$str2
# Run a command with an environment variable
$str1=" run DEBIAN_FRONTEND=noninteractive apt-get upgrade -y"
$command=$ubuntu1804_path+$str1
invoke-expression -Command $command
我验证了这确实阻止了任何用户交互的提示,从而解决了 XY 问题。尽管我还不能通过检查该 shell 的环境变量来直接验证这一点,但我认为这确实(临时)设置了环境变量DEBIAN_FRONTEND=noninteractive
。