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

2024-01-08

在 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-Rawflag 似乎使字符串中的第一个单词打印(但不是整个字符串)。不包含“”字符的命令有时似乎有效。但我还没有找到一致的方法。

一个类似的问题 https://stackoverflow.com/questions/63587559/run-bash-script-in-wsl-through-powershell-script似乎不能直接与 wsl 一起工作,并且似乎不能运行驻留在 Windows 文件系统上的脚本文件。


稳健而有效的方法从 Windows 执行基于 shebang-line 的 shell 脚本 is via wsl.exe -e

wsl -e ./simple_script.sh # !! ./ is required

Note:

  • Without ./要明确指示可执行文件位于当前目录中,该命令将失败quietly(仅位于列出的目录中的可执行文件PATH可以调用环境变量仅按名称).

  • -e bypassesLinux 端的 shell 的参与,而是让 Linux 系统函数解释基于 shebang-line 的纯文本文件,该文件会自动遵循指定的解释器。

    • 也许令人惊讶的是,WSL 认为all文件位于Windows文件系统,包括纯文本文件系统,具有可执行位设置,您可以轻松验证wsl -e ls -l ./simple_script.sh

As for 你尝试过什么:

$simple_script = Get-Content ./simple_script.sh
wsl bash -c $simple_script

主要问题是Get-Content https://learn.microsoft.com/powershell/module/microsoft.powershell.management/get-content默认情况下返回一个array行,并尝试使用该数组作为参数外部程序例如wsl导致数组的元素被传递作为单独的论点.

The 立即修复是使用-Raw switch,这使得Get-Content将文件内容返回为单行、多行字符串.

然而,由于一个非常不幸的、长期存在的错误,PowerShell - 最高 v7.2.x - 需要manual \-escaping of 嵌入式"人物在传递给外部程序的参数中.

  • See 这个答案 https://stackoverflow.com/a/59036879/45375了解详情。

所以:

# 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 PowerShell 7.2.x
wsl bash -c ($simple_script -replace '"', '\"')

请注意,虽然它是试图通过提供脚本文本来绕过转义的需要通过管道 (stdin), this does not从 PowerShell 7.3.3 开始,按预期工作:

# !! Tempting, but does NOT work.
Get-Content -Raw ./simple_script.sh | wsl -e bash

这不起作用的原因是PowerShell 总是附加一个Windows格式换行符(CRLF)到通过管道发送到外部程序的内容,Bash 无法识别。

  • 这种有问题的行为正在讨论中GitHub 问题 #13579 https://github.com/PowerShell/PowerShell/issues/13579.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 powershell 在 wsl 上运行 bash 脚本? 的相关文章

  • 如何查找出现在括号之间的所有单词?

    我有一个文件 其中包含括号中的一些单词 我想编制一个出现在那里的所有独特单词的列表 例如 This is some text This text has some words in parenthesis Sometimes there a
  • 回车前清除行

    我想在一行中打印一个进度 所以我使用回车符 问题是我的进步不是增加 gt 这意味着第一个打印可能是Processing Foo Bar Baz下一个打印可能是Processing Foo 简单回车的问题是第二次打印将是重叠的通过第一张打印
  • 如何从 C 文件更改终端中的目录

    如何从 C 程序更改将在终端上生效的目录 实际上不要告诉 system 函数或 chdir 函数 这些仅适用于 C 中的进程或子 shell 假设我正在从 bash shell 执行一个 C 程序 其进程 ID 为 10223 那么 我可以
  • 寻找下一个开放端口

    有没有什么办法 使用基本的 Unix 命令 找到下一个未使用的端口号 从端口 4444 开始向上 我通过 ssh 通过 openssh 进入 Windows XP 计算机 运行 Cygwin 工具并使用 bash shell 谢谢 戴夫 尝
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • -bash: gulp: 在 Mac 中找不到命令

    我尝试在 mac 中安装 gulp 如下所示 Is iMac itop npm root Users itop node modules Is iMac itop npm config set prefix usr local Is iMa
  • 如何创建自定义 Powershell 运算符?

    是否可以在 Powershell 中创建自定义运算符 而且 我该怎么做呢 我搜索过谷歌 但没有任何结果 我特指一个中缀运算符 示例列表 包含 元素 我已经创建了 cmdlet 使用 Powershell 和 C 模块等 所以我只需要大概的内
  • 如何在 Bash 中为数组赋值?

    我正在尝试从文本文件中读取值列表 你好 txt 并将它们存储在一个数组中 counter 0 cat hello txt while read line do Unix Array counter line let counter coun
  • 参考当前命令的先前参数

    例如 我想执行以下操作 mv xxxx xxxx bak 我知道我可以使用这个命令 mv xxxx bak 我认为这在某种程度上并不直接 如果我能做到这一点那就太好了 mv xxxx 1 bak 有时我需要这样 echo xxxx yyyy
  • Bash 中 $() 和 () 之间的区别

    当我打字时ls l echo file 支架的输出 这只是简单的回显 被获取并传递到外部ls l命令 就等于简单的ls l file 当我打字时ls l echo file 我们有错误 因为不能嵌套 内部外部命令 有人可以帮助我理解之间的区
  • 将所有脚本参数复制到另一个变量

    我需要复制所有脚本参数并将它们传递给另一个脚本 我尝试这样做 args printargs sh args echo printargs sh args 但在这种情况下 如果我使用包含空格的参数调用我的父脚本 例如 script sh ar
  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • sed-删除不包含模式的行

    我很惊讶我在 SO 上找不到与此类似的问题 如何使用 sed 删除所有不包含特定模式的行 例如 我有这个文件 cat kitty dog giraffe panda lion tiger 我想要一个 sed 命令 当调用该命令时 它将删除所
  • 如何从计划任务中删除触发器

    我使用 PowerShell 中的任务计划程序 cmdlet 为 Perfmon 数据收集器集的计划任务配置触发器 我使用以下命令来修改计划任务并在服务器启动时启动数据收集器集 trigger New ScheduledTaskTrigge
  • 具有非阻塞读取功能的 Bash 脚本

    我想使用命名管道将一些数据发送到根进程 这是脚本 效果很好 bin sh pipe tmp ntp if p pipe then mknod m 666 pipe p fi while true do if read line lt pip
  • 使用 PowerShell 检查 AD 中是否存在组

    我想为该组创建代码来检查该组是否存在 但是 我无法开始工作 因为它成功地将用户和组的部分成员仅添加到一个组中 而不是其他组 因为我设法在活动目录中创建一个组并从 csv 中读取 这是我的代码和结果 似乎在成功添加用户并添加组成员后我总是收到
  • IFS 分隔一个字符串,如“Hello”,“World”,“this”,“is,一个无聊”,“line”

    我正在尝试解析 csv 文件 但 IFS 遇到一些问题 该文件包含如下行 Hello World this is a boring line 各列用逗号分隔 因此我尝试使用以下代码分解该行 IFS read r a tempArr lt l
  • Powershell:启动进程不将参数传递给 cmd.exe

    这些是在 powershell 控制台 Windows 10 中运行的命令 username Username password Password securePassword ConvertTo SecureString password
  • 执行 rvm use 2.0.0 --default 时收到“警告!路径未正确设置”

    以上第一次不起作用 第二次起作用 尝试将任何新 shell 窗口的 ruby 版本设置为 2 0 0 Doing rvm use 2 0 0 default gives Warning PATH is not properly set up
  • 作为服务运行时未找到 PowerShell 模块

    我有一个项目 我将 Office 365 许可证分配给用户 有一个 Web 项目允许管理员查看可用许可证并为用户选择许可证 在后台 有一项服务每 15 分钟执行一次实际的许可证分配 以及许多其他任务 我们不直接分配许可证的原因是用户可能尚未

随机推荐

  • 删除字典中的一些列表项

    删除字典中的一些列表项 你好 我有一本字典 phone first 100 second 200 third 10 12 5 38 fourth 400 假设我想从 电话 字典中删除 12 和 5 有没有办法使用 del 函数来做到这一点
  • Fullcalendar 调度程序上的粘性标题

    我对试图通过完整的日历调度程序获得粘性标题感到生气 我试过 height parent 我看了很多帖子 但没有一个起作用 但是有 2 个滚动条 一个用于主窗口 一个用于日历 有粘性标题的解决方案吗 Thanks 最后它与类似的东西一起工作
  • 使用 Java 10 在 RCP 应用程序中未找到主机插件 JavaSE

    我将 RCP 应用程序从 Eclipse Oxygen 迁移到 Photon 还从 Java 8 迁移到 Java 10 如果我从 Eclipse 启动该代码 并且该应用程序可以正常工作 但是 当我尝试构建应用程序时 出现错误 plug i
  • 如何使用 iOS Simulator 7 \ XCode 5 测试 iOS 7 之前的 UI(无需升级 iOS 7 应用程序)

    在 XCode 4 6 3 上编译我的应用程序并在 iOS 7 上运行它效果很好 在 XCode 5 上编译我的应用程序并在 iOS 7 上运行它会导致 UI 混乱 我现在不想处理 iOS 7 选择器 标签栏 表格视图等 Goal 我希望能
  • Visual Studio下编译时找不到模块

    我有非常简单的 TypeScript 应用程序 它使用 webpack 可以正常编译 但在尝试在 Visual Studio 中构建时出现错误 Build Cannot find module react 我被困住了 感谢任何帮助 包 js
  • 使用文件发送邮件至 Android 11 的操作

    我在使用 Android 11 与 Gmail 应用程序或其他电子邮件发送器共享 zip 文件时遇到问题 Intent email intent new Intent Intent ACTION SENDTO Uri fromParts m
  • Nexus 3:如何获取最新快照?

    众所周知 Nexus 3 还没有 REST API 这对我来说很奇怪 我只能使用 wget 或 curl 手动下载工件 但当我使用 Maven 3 时 所有快照工件都使用时间戳命名 如下所示 myartifact 1 0 20161215
  • 如何将多列值合并到一列中? Asp.net Gridview C#

    首先 我不知道这是否可能 正确的方法甚至是否有效 但我希望你们能帮助我 我会尽力解释 我在 ASPX 页面上有一个 GridView 控件
  • Java 的 ThreadLocal 底层是如何实现的?

    ThreadLocal是如何实现的 它是用 Java 实现的 使用一些从 ThreadID 到对象的并发映射 还是使用一些 JVM 钩子来更有效地完成它 这里的所有答案都是正确的 但有点令人失望 因为它们在某种程度上掩盖了如何聪明Threa
  • 使用 Internet Explorer 11 运行 64 位 Java

    我有 Internet Explorer 11 我有一些仅在 64 位 Java 上运行的帮助文件 默认情况下 IE 以 32 位启动 谷歌搜索后我发现通过启用增强保护 IE 将以 64 位启动 我能够实现 64 位的 IE 然而它仍然推出
  • 如何在php中上传/存储多个图像到mysql数据库中

    在这里 我正在制作一个用户可以上传多个图像的表单 下面的 HTML 代码
  • 如何将 Swift String 桥接到 Objective C NSString?

    我正在服用疯狂的药吗 直接从文档中得出 Swift 会自动在 String 类型和 NSString 类之间架起桥梁 这意味着在任何使用 NSString 对象的地方 都可以使用 Swift String 类型来代替 并获得这两种类型的优点
  • 使用 exec();在 php 脚本中从 shell 发送电子邮件

    我正在尝试制作一个使用以下内容的 php 脚本exec 函数来运行发送电子邮件的命令 我正在看这样的东西 但是我不确定我在 php 中声明的变量是否可以在 exec 函数中使用 然而该命令似乎也不正确 当用单引号 变量不展开 你可以尝试这样
  • 如何组合“conda create”参数“--file”、“--prefix”和“--copy”?

    我想基于特定路径中的环境文件创建一个 conda 环境 不使用符号链接 因此 我想运行以下 conda 命令 conda create file environment yml prefix python copy 文件environmen
  • 增加 PHP 脚本执行时间 [重复]

    这个问题在这里已经有答案了 我想使用 PHP 发送数百封电子邮件 为了增加执行时间 我使用了ini set 最大执行时间 10 但发送后30电子邮件浏览器向我显示一个空白页面 并且不发送所有电子邮件 我还将限制更改为 300 600 Try
  • http 跟踪实用程序

    我需要跟踪 嗅探来自其他机器的 http 流量 例如来自我的 Android 手机或 ios 设备 过去我使用MSSOAPT 这里描述http www devproconnections com article net framework2
  • 在 Perl 中,如何按值的频率排序?

    我正在尝试创建一个程序来计算数据文件列中出现的不同值 因此 如果一列的可能值为 A B C 则输出类似于 A 456 B 234 C 344 通过执行以下操作 我可以轻松获得 A B 和 C 的运行计数 my count for my f
  • 使用 Mono.Cecil 替换对类型/命名空间的引用

    背景 不必要的 令人困惑的 仅供好奇的人使用 我正在使用 Unity3D for Mobile 的免费版本 它不允许我使用System Net Sockets移动设备上的命名空间 问题是我正在使用编译的 dll引用的库 即 IKVM Sys
  • Haskell 脸书示例

    我被 haskell 类型困住了 LANGUAGE OverloadedStrings module Main main where import qualified Facebook as FB import Network HTTP C
  • 如何使用 powershell 在 wsl 上运行 bash 脚本?

    在 Windows 上的当前目录中 我有以下脚本文件 simple script sh bin bash echo hi from simple script 我希望通过 powershell 命令行在 wsl 上运行此脚本 使用wsl命令