从 powershell 执行时,WSL 无法识别 "uname -s" 等命令

Commands like "uname -s" is not recognized in WSL when executed from poweshell

我需要在 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 执行?

问题出在命令参数中的子表达式 $( )。 PowerShell 在表达式模式下解释这些(因为允许扩展的双引号)并在将参数传递给 Ubuntu1804.

之前寻找名为 uname 的可执行文件

解决方案:

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

  • 翻转你的引号,这样扩展就不会发生:... 'sudo curl -L " ...

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

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

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

about_Parsing

about_Environment_Variables

对于像 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

使用 like $Env:USER 在 WSL 命令中包含环境变量不适用于命令 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