![Сценарий](https://rvso.com/image/1628797/%D0%A1%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B9.png)
Сценарий
При выполнении автоматической установки некоторого программного обеспечения на WSL Ubuntu 18.04 из Windows Powershell apt upgrade
команда возвращает следующее приглашение:
Этот вопросхорошо объясняет, что можно предотвратить этот запрос, установив переменную окружения в WSL Ubuntu 18.04 перед запуском apt upgrade
команды. Я проверил, что это действительно работает. Однако у меня возникли некоторые проблемы с установкой этой переменной окружения для WSL Ubuntu 18.04 из Powershell. Эти проблемы подробно описаны в разделе «Попытки».
Вопрос
Как установить переменную среды DEBIAN_FRONTEND=noninteractive
в WSL Ubuntu 18.04 из скрипта PowerShell?
МВЭ
Ниже приведен 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."
Попытки
Сначала я пытался установить переменную окружения, анализируя bash -c DEBIAN_FRONTEND=noninteractive
из WSL. Затем я попробовал wsl DEBIAN_FRONTEND=noninteractive
. Затем я попробовал invoke-expression -Command
то, что описано в MWE. Все они либо зависают на приглашении (первые 2 не показывают приглашение, а продолжают ждать бесконечно (я ждал по 2 часа каждый и проверил, что сама команда в wsl занимает всего +- 30 минут)), последний переходит в приглашение в powershell:
.
Сомнения
Я думаю, что наблюдения, сделанные в ходе трех попыток, подразумевают один из двух случаев:
- Я неправильно устанавливаю переменную среды
DEBIAN_FRONTEND=noninteractive
из PowerShell. - Или PowerShell
DEBIAN_FRONTEND=noninteractive
правильно устанавливает переменную среды в какой-то оболочке, но затем открывает новую оболочку для следующей команды, в которой переменная среды не установлена.
Чтобы проверить, правильно ли я установил переменную окружения, я попробовал запустить 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. Хотя я пока не могу проверить это напрямую, проверив переменные окружения этой оболочки, япредполагатьэто действительно (временно) устанавливает переменную окружения DEBIAN_FRONTEND=noninteractive
.