在Windows上的当前目录中,我有以下脚本文件simple_script.sh:
#!/bin/bash
echo "hi from simple script"我希望通过powershell命令行在wsl上运行这个脚本。
使用wsl命令,我找不到一种方法让wsl调用脚本代码。
以下命令起作用(我认为)
wsl bash -c "echo hi from simple script"但是,当试图将脚本内容加载到变量并运行时,它不像预期的那样工作:
$simple_script = Get-Content ./simple_script.sh
wsl bash -c $simple_script在以下方面失败:
bash: -c: option requires an argument我试了几个变体。使用带有Get-Content标志的-Raw似乎是要打印字符串中的第一个单词(但不是整个字符串)。不包含“”字符的命令有时似乎有效,但我没有找到一致的方法。
一个类似的问题似乎不直接使用wsl,也没有运行驻留在wsl文件系统上的脚本文件。
发布于 2022-05-11 17:34:25
从Windows wsl.exe -e执行基于shebang行的shell脚本的健壮而高效的方法是通过。
wsl -e ./simple_script.sh # !! ./ is required注意:
./显式地指示可执行文件位于当前目录中,则命令将悄然失败(只有位于PATH环境变量中列出的目录中的可执行文件才能按名称调用)。-e绕过Linux端的shell,而让Linux系统函数解释基于shebang行的纯文本文件,该文件自动授予指定的解释器。- Perhaps surprisingly, WSL considers _all_ files located in the _Windows_ file-system, including plain-text ones, to have the _executable bit_ set, which you can easily verify with `wsl -e ls -l ./simple_script.sh`至于,你尝试过
$simple_script = Get-Content ./simple_script.sh
wsl bash -c $simple_script主要问题是,Get-Content默认返回一个行数组,并且试图将该数组用作外部程序(如wsl )的参数,会导致数组的元素作为单独的参数传递。
直接修复的方法是使用-Raw switch,这使Get-Content将文件内容作为一个多行字符串返回。
但是,由于一个非常不幸、长期存在的错误,在传递给外部程序E 252的参数中,\__-escaping 手动 of embedded 字符E 250E 151,而PowerShell --至少达到了v7.2.3。
因此:
# Using -Raw, read the file in full, as a single, multi-line string.
$simple_script = Get-Content -Raw ./simple_script.sh
# !! The \-escaping is needed up to at least PowerShell 7.2.3
wsl bash -c ($simple_script -replace '"', '\"')请注意,虽然很容易绕过通过管道 (stdin)提供脚本文本的需要,但该将非E 269E 170按预期工作,如PowerShell 7.2.3E 271
# !! Tempting, but does NOT work.
Get-Content -Raw ./simple_script.sh | wsl -e bash这不起作用的原因是,PowerShell总是在要通过管道发送到外部程序的内容中附加一个换行符( newline,CRLF),而Bash不承认这一点。
这种有问题的行为正在GitHub问题#13579中讨论。
发布于 2022-09-20 19:32:13
我很难让上面的步骤为我工作。结果发现,这是WSL中默认Linux发行版的一个问题。这些步骤解决了这个问题。
步骤1:检查当前发行版
❯ wsl --list
Windows Subsystem for Linux Distributions:
docker-desktop-data (Default)
Ubuntu
docker-desktopdocker-desktop-data的违约似乎是问题所在。
步骤2:更改默认值
> wsl --setdefault Ubuntu
从那以后一切都开始运作了。
也见
发布于 2022-05-07 12:44:05
要在wsl上运行脚本,只需调用bash
> bash simple_script.sh
hi from simple script若要将其保存在变量中并以bash脚本的形式在wsl或powershell中运行,则不需要Get-Content。
> $simple_script = bash /mnt/c/Users/user-name/path/to/simple_script.sh
> Write-Output $simple_script
hi from simple script注意: Powershell有一个别名将echo映射到Write-Output,所以您也可以使用echo
> $simple_script = bash /mnt/c/Users/user-name/path/to/simple_script.sh
> echo $simple_script
hi from simple script如果这是你最初的目标,你也可以抓取内容。
> Get-Content simple_script.sh
#!/bin/bash
echo "hi from simple script"
> $content = Get-Content .\simple_script.sh
> Write-Output $content
#!/bin/bash
echo "hi from simple script"https://stackoverflow.com/questions/72151630
复制相似问题