Сценарий

Сценарий

Сценарий

При выполнении автоматической установки некоторого программного обеспечения на 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: введите описание изображения здесь.

Сомнения

Я думаю, что наблюдения, сделанные в ходе трех попыток, подразумевают один из двух случаев:

  1. Я неправильно устанавливаю переменную среды DEBIAN_FRONTEND=noninteractiveиз PowerShell.
  2. Или 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.

Связанный контент