从 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 -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 执行?
问题出在命令参数中的子表达式 $( )
。 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
我需要在 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 执行?
问题出在命令参数中的子表达式 $( )
。 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