从poweshell执行

时间:2019-03-20 12:18:56

标签: powershell environment-variables 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 -suname -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 -suname -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中执行吗?

此外,我如何在WSL命令中合并诸如$USER之类的环境变量的值并从Powershell执行?

2 个答案:

答案 0 :(得分:2)

问题在于命令参数中的子表达式$( )。 PowerShell在表达式模式下解释它们(由于允许扩展的双引号),并且在将参数传递给uname之前正在寻找名为Ubuntu1804的可执行文件。

解决方案:

  • run之后使用stop-parser运算符:--%

  • 翻转引号,以免扩展:... 'sudo curl -L " ...

  • 转义子表达式:`$`(`)

要回答如何在WSL命令中包括环境变量:

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

about_Parsing

about_Environment_Variables

答案 1 :(得分:0)

对于像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 -这样的包含流水线字符(|)的命令,仅使用--%将不起作用。在这种情况下,将命令括在双引号中的方式如下:

 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

在powershell命令中将WSL的环境变量包括在内对我起作用的是使用停止解析运算符--%,如下所示:

 Ubuntu1804 run --% sudo usermod -aG docker $USER