在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
标志似乎可以打印字符串中的第一个单词(但不是整个字符串)。不包含'"'字符的命令有时似乎可以工作。但我还没有找到一致的方法。
A similar looking question似乎不能直接与wsl一起工作,并且似乎不能运行驻留在Windows文件系统上的脚本文件。
3条答案
按热度按时间oaxa6hgo1#
从Windows执行基于shebang行的shell脚本的健壮而有效的方法是通过
wsl.exe -e
**注:
./
不显式指示可执行文件位于当前目录中,则命令将 * 悄悄地 * 失败(只能 * 按名称 * 调用位于PATH
环境变量中列出的目录中的可执行文件)。-e
* 绕过 * Linux端的shell,而是让Linux系统函数解释基于shebang行的纯文本文件,这会自动执行指定的解释器。wsl -e ls -l ./simple_script.sh
轻松验证这一点至于你所尝试的:
主要的问题是
Get-Content
默认返回一个 array 行,并且试图将该数组用作 * 外部程序 *(如wsl
)的参数会导致数组的元素被 * 作为单独的参数 * 传递。立即修复是使用
-Raw
开关,这使得Get-Content
将文件内容作为 * 单个多行字符串 * 返回。然而,*由于一个非常不幸的长期存在的错误,PowerShell -最高版本为v7.2.x -需要 * 手动 *
\
- 转义在传递给外部程序的参数中 * 嵌入"
字符。因此:
请注意,虽然尝试通过管道 *(stdin)提供脚本文本 * 来绕过转义的需要是很诱人的,但从PowerShell 7.3.3开始,这**并不 * 按预期工作:
这不起作用的原因是PowerShell总是将 * Windows格式 * 的换行符(CRLF)附加到通过管道发送到外部程序的内容,Bash无法识别。
cczfrluj2#
我在执行上述步骤时遇到了麻烦。原来是WSL中默认的Linux发行版的问题。这些步骤解决了它。
步骤1:检查当前发行版
docker-desktop-data
默认值似乎是问题所在。步骤2:更改默认值
> wsl --setdefault Ubuntu
从那以后,一切都开始工作了。
另见
How to set default distro using WSL2 on Windows 10
icomxhvb3#
要在
wsl
上运行脚本,只需调用bash
要将其保存在变量中并使其作为
wsl
或powershell
中的bash
脚本运行,则不需要Get-Content
**注意:**Powershell具有从
echo
到Write-Output
的别名Map,因此您也可以使用echo
如果这是你最初的目标,你也可以抓取内容。