我需要在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中执行吗?
此外,我如何在WSL命令中合并诸如$USER
之类的环境变量的值并从Powershell执行?
答案 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