Команды типа «uname -s» не распознаются в WSL при выполнении из poweshell

#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 - , --% не может повлиять на часть после | . Но заключение всей команды в двойные кавычки работает хорошо! @TheIncorrigible1

3. Включение переменных среды в команду 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