シナリオ
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 回の試行から得られた観察結果は、次の 2 つのケースのいずれかを示唆していると思います。
- PowerShell から環境変数を
DEBIAN_FRONTEND=noninteractive
正しく設定していません。 - または、PowerShell は
DEBIAN_FRONTEND=noninteractive
一部のシェルで環境変数を正しく設定しますが、次のコマンド用に新しいシェルを開きますが、そのシェルでは環境変数が設定されていません。
環境変数を正しく設定したことを確認するために、 を実行してみましたwsl printenv
が、これは wls から を実行したときとは異なるリストを返します。 wsl でprintenv
環境変数を手動で設定すると、コマンドは環境変数を正しく表示します。 ただし、WSL Ubuntu 18.04 を閉じて再度開き、コマンドを再実行すると、環境変数は消えています。 この観察結果は、疑問のオプション 2 が可能であることを示しています。の WSL 出力にはあるのに、powershellの出力にはないため、環境変数が powershell から正しく設定されているかどうかを判断する方法はまだ見つかっていません。DEBIAN_FRONTEND=noninteractive
printenv
printenv
printenv
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
。