首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用powershell在wsl上运行bash脚本?

如何使用powershell在wsl上运行bash脚本?
EN

Stack Overflow用户
提问于 2022-05-07 10:27:46
回答 3查看 3.1K关注 0票数 4

在Windows上的当前目录中,我有以下脚本文件simple_script.sh:

代码语言:javascript
复制
#!/bin/bash
echo "hi from simple script"

我希望通过powershell命令行在wsl上运行这个脚本。

使用wsl命令,我找不到一种方法让wsl调用脚本代码。

以下命令起作用(我认为)

代码语言:javascript
复制
wsl bash -c "echo hi from simple script"

但是,当试图将脚本内容加载到变量并运行时,它不像预期的那样工作:

代码语言:javascript
复制
$simple_script = Get-Content ./simple_script.sh
wsl bash -c $simple_script

在以下方面失败:

代码语言:javascript
复制
bash: -c: option requires an argument

我试了几个变体。使用带有Get-Content标志的-Raw似乎是要打印字符串中的第一个单词(但不是整个字符串)。不包含“”字符的命令有时似乎有效,但我没有找到一致的方法。

一个类似的问题似乎不直接使用wsl,也没有运行驻留在wsl文件系统上的脚本文件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-05-11 17:34:25

从Windows wsl.exe -e执行基于shebang行的shell脚本的健壮而高效的方法是通过。

代码语言:javascript
复制
wsl -e ./simple_script.sh # !! ./ is required

注意:

  • 如果没有./显式地指示可执行文件位于当前目录中,则命令将悄然失败(只有位于PATH环境变量中列出的目录中的可执行文件才能按名称调用)。
  • -e绕过Linux端的shell,而让Linux系统函数解释基于shebang行的纯文本文件,该文件自动授予指定的解释器。
代码语言:javascript
复制
- 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`

至于,你尝试过

代码语言:javascript
复制
$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。

  • 有关详细信息,请参阅这个答案,包括在v7.3预览版本中已作为实验特征提供的潜在的未来修补程序。

因此:

代码语言:javascript
复制
# 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

代码语言:javascript
复制
# !! Tempting, but does NOT work.
Get-Content -Raw ./simple_script.sh | wsl -e bash

这不起作用的原因是,PowerShell总是在要通过管道发送到外部程序的内容中附加一个换行符( newline,CRLF),而Bash不承认这一点。

这种有问题的行为正在GitHub问题#13579中讨论。

票数 5
EN

Stack Overflow用户

发布于 2022-09-20 19:32:13

我很难让上面的步骤为我工作。结果发现,这是WSL中默认Linux发行版的一个问题。这些步骤解决了这个问题。

步骤1:检查当前发行版

代码语言:javascript
复制
❯ wsl --list
Windows Subsystem for Linux Distributions:
docker-desktop-data (Default)
Ubuntu
docker-desktop

docker-desktop-data的违约似乎是问题所在。

步骤2:更改默认值

> wsl --setdefault Ubuntu

从那以后一切都开始运作了。

也见

如何在Windows 10上使用WSL2设置默认发行版

票数 1
EN

Stack Overflow用户

发布于 2022-05-07 12:44:05

要在wsl上运行脚本,只需调用bash

代码语言:javascript
复制
> bash simple_script.sh
hi from simple script

若要将其保存在变量中并以bash脚本的形式在wslpowershell中运行,则不需要Get-Content

代码语言:javascript
复制
> $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

代码语言:javascript
复制
> $simple_script = bash /mnt/c/Users/user-name/path/to/simple_script.sh
> echo $simple_script
hi from simple script

如果这是你最初的目标,你也可以抓取内容。

代码语言:javascript
复制
> 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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72151630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档