#powershell #environment-variables #ubuntu-18.04 #windows-subsystem-for-linux
#powershell #переменные среды #ubuntu-18.04 #windows-subsystem-for-linux
Вопрос:
Мне нужно выполнить следующую команду в WSL:
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Чтобы выполнить это из powershell, я попытался запустить:
Ubuntu1804 run "sudo curl -L 'https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)' -o /usr/local/bin/docker-compose"
Но возникают ошибки, поскольку он не может найти значение uname -s
и uname -m
uname : The term 'uname' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling
of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:107
... ocker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(u ...
~~~~~
CategoryInfo : ObjectNotFound: (uname:String) [], CommandNotFoundException
FullyQualifiedErrorId : CommandNotFoundException
Но следующая команда работает, поскольку я вручную ввел значение uname -s
и uname -m
в этой команде.
Ubuntu1804 run "sudo curl -L 'https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64' -o /usr/local/bin/docker-compose"
Может кто-нибудь, пожалуйста, помочь мне найти при использовании powershell, как включить результаты некоторых команд в другую команду и выполнить ее в WSL?
Кроме того, как я могу включить значение переменных среды типа $USER
в команды WSL и выполнить из powershell?
Ответ №1:
Проблема заключается в ваших подвыражениях $( )
в аргументе команды. PowerShell интерпретирует их в режиме выражения (из-за двойных кавычек, которые допускают расширение) и ищет исполняемый файл с именем uname
перед передачей аргумента в Ubuntu1804
.
Решения:
-
Используйте оператор stop-parser после
run
:--%
-
Измените кавычки, чтобы расширение не происходило:
... 'sudo curl -L " ...
-
Экранируйте подвыражения:
`$`(`)
Чтобы ответить, как вы включаете переменные среды в команду WSL:
amp; Ubuntu1804.exe ... $Env:USER ...
about_Parsing
about_Environment_Variables
Комментарии:
1. @Thelncorrigible1 Спасибо за ответ! Первый вариант использования оператора stop-parser сработал для меня!
2. Но использование оператора stop-parser не работает для команды, содержащей символ конвейера. Как говорится в официальной документации: Символ остановки синтаксического анализа действует только до следующего символа перевода строки или конвейера. Вы не можете использовать символ продолжения для расширения его действия или использовать разделитель команд для прекращения его действия. В такой команде, как
Ubuntu1804 run curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
,--%
не может повлиять на часть после|
. Но заключение всей команды в двойные кавычки работает хорошо! @TheIncorrigible13. Включение переменных среды в команду WSL с помощью ‘$Env:USER’ у меня не сработало. Я добавляю то, что сработало для меня в этом случае, в качестве ответа здесь.
4. @AnjanaDyna Если вы хотите использовать переменные среды
--%
И ссылаться на них, используйте%USER%
пакетный синтаксис (поскольку именно к нему он возвращается в данном случае)
Ответ №2:
Для обычных команд типа sudo apt-get update -y
просто используйте оператор stop-parsing как:
Ubuntu1804 run --% sudo apt-get update -y
Для команд типа, curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
которая включает символы конвейера ( |
) , использование only --%
не сработает. В таких случаях заключение команды в двойные кавычки работает следующим образом:
Ubuntu1804 run --% "curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -"
Кроме того, избегайте использования обратной косой черты или новой строки в командах при использовании --%
оператора. Например, вместо того, чтобы использовать подобное:
Ubuntu1804 run --% sudo apt-get install
apt-transport-https
ca-certificates
curl
gnupg-agent
software-properties-common
Выполнить как:
Ubuntu1804 run --% sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
Включение переменных среды в команду WSL с помощью like $Env:USER
не сработало для команды sudo usermod -aG docker $USER
.
Это ошибка, если я использую ее следующим образом:
Ubuntu1804 run sudo usermod -aG docker $Env:USER
или как это:
Ubuntu1804 run --% sudo usermod -aG docker $Env:USER
Что помогло мне включить переменные среды WSL в команды powershell, так это использование оператора stop-parsing --%
следующим образом:
Ubuntu1804 run --% sudo usermod -aG docker $USER