設想
從 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 小時以上,並驗證wsl 中的命令本身只需要+- 30 分鐘)),後者轉到powershell 中提示:
。
疑慮
我認為這 3 次嘗試的觀察結果意味著以下兩種情況之一:
- 我沒有
DEBIAN_FRONTEND=noninteractive
從 powershell 正確設定環境變數。 - 或者,powershell
DEBIAN_FRONTEND=noninteractive
在某個 shell 中正確設定了環境變量,但隨後為下一個命令開啟了一個新 shell,其中未設定環境變數。
為了驗證我設定的環境變數是否正確,我嘗試運行wsl printenv
,但是這會傳回一個與我從 wls 運行時不同的清單printenv
。如果我DEBIAN_FRONTEND=noninteractive
在 wsl 中手動設定環境變量,則該printenv
命令會正確顯示環境變數。但是,如果我關閉並重新開啟 WSL Ubuntu 18.04 並重新執行命令printenv
,環境變數就會消失。這項觀察結果意味著疑慮中的選項 2 是可能的。我還沒有找到一種方法來確定環境變數是否從 powershell 設定正確,因為printenv
當它位於 的 WSL 輸出中時,它不在 powershell 的輸出中printenv
。
答案1
在 git 搜尋包含DEBIAN_FRONTEND=noninteractive
我發現的 powershell 腳本後一個例子這表示可以使用以下命令從 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
。