Команды типа "uname -s" не распознаются в WSL при выполнении из poweshell - PullRequest
2 голосов
/ 20 марта 2019

Мне нужно выполнить следующую команду в 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?

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Проблема в ваших подвыражениях $( ) в аргументе команды.PowerShell интерпретирует их в режиме выражения (из-за двойных кавычек, которые допускают расширение) и ищет исполняемый файл с именем uname перед передачей аргумента Ubuntu1804.

Решения:

  • Используйте оператор стоп-парсера после run: --%

  • Переверните ваши кавычки, чтобы расширение не произошло: ... 'sudo curl -L " ...

  • Выход из подвыражений: `$`(`)

Чтобы ответить, как включить переменные среды в команду WSL:

& Ubuntu1804.exe ... $Env:USER ...

about_Parsing

about_Environment_Variables

0 голосов
/ 21 марта 2019

Для обычных команд, таких как sudo apt-get update -y, просто используйте оператор останова парсинга:

Ubuntu1804 run --% sudo apt-get update -y

Для таких команд, как curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -, который включает символы конвейера (|), использование только --% не будетРабота.В таких случаях заключение команды в двойные кавычки работает следующим образом:

 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 с использованием как $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 используют оператор остановки синтаксического анализа --%, например:

 Ubuntu1804 run --% sudo usermod -aG docker $USER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...