Ela*_*oni 10 bash powershell windows-subsystem-for-linux wsl-2
在 Windows 上的当前目录中,我有以下脚本文件 simple_script.sh:
#!/bin/bash
echo "hi from simple script"
Run Code Online (Sandbox Code Playgroud)
我希望通过 powershell 命令行在 wsl 上运行此脚本。
使用该wsl命令,我找不到告诉 wsl 调用脚本代码的方法。
以下命令有效(我认为)
wsl bash -c "echo hi from simple script"
Run Code Online (Sandbox Code Playgroud)
但是,当尝试将脚本内容加载到变量中并运行时,它无法按预期工作:
$simple_script = Get-Content ./simple_script.sh
wsl bash -c $simple_script
Run Code Online (Sandbox Code Playgroud)
失败:
bash: -c: option requires an argument
Run Code Online (Sandbox Code Playgroud)
我尝试了几种变体。Get-Content与标志一起使用-Raw似乎会打印字符串中的第一个单词(但不是整个字符串)。不包含“”字符的命令有时似乎有效。但我还没有找到一致的方法。
类似的问题似乎不能直接与 wsl 一起工作,并且似乎不能运行驻留在 Windows 文件系统上的脚本文件。
mkl*_*nt0 21
从 Windows 执行基于 shebang-line 的 shell 脚本的健壮且高效的方法是通过wsl.exe -e
wsl -e ./simple_script.sh # !! ./ is required
Run Code Online (Sandbox Code Playgroud)
笔记:
如果不./明确指示可执行文件位于当前目录中,则该命令将安静地失败(只能按名称调用位于环境变量中列出的目录中的PATH可执行文件)。
-e 绕过Linux 端 shell 的参与,而是让 Linux 系统函数解释基于 shebang 行的纯文本文件,该文件会自动遵循指定的解释器。
ERROR: CreateProcessEntryCommon:502: execvpe ./t.sh failed 8, [1]则意味着您的.sh文件缺少 shebang 行或其 shebang 行格式错误;确保您的文件以文件开头的一行开头,并且该文件是 UTF-8 编码的,#!/bin/bash没有BOM ,并使用Unix 格式 LF-only newlines。wsl -e bash ./simple_script.sh也许令人惊讶的是,WSL 认为位于Windows文件系统中的所有文件(包括纯文本文件)都设置了可执行位,您可以使用它轻松验证wsl -e ls -l ./simple_script.sh
至于你尝试过的:
# !! WRONG
$simple_script = Get-Content ./simple_script.sh
wsl bash -c $simple_script
Run Code Online (Sandbox Code Playgroud)
主要问题是,Get-Content默认情况下返回一个行数组,并尝试使用该数组作为外部程序的参数,例如wsl导致数组的元素作为单独的参数传递。
立即修复是使用 switch -Raw,它使Get-Content文件内容作为单个多行字符串返回。
然而,由于一个非常不幸的、长期存在的错误,PowerShell(直到 v7.2.x)需要手动 \转义传递给外部程序的参数中的嵌入"字符。
所以:
# 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 '"', '\"')
Run Code Online (Sandbox Code Playgroud)
请注意,虽然尝试通过管道(stdin)提供脚本文本来绕过转义的需要很诱人,但从 PowerShell 7.3.3 开始,这并不能按预期工作:
# !! Tempting, but does NOT work.
Get-Content -Raw ./simple_script.sh | wsl -e bash
Run Code Online (Sandbox Code Playgroud)
这不起作用的原因是PowerShell 总是将Windows 格式的换行符 (CRLF) 附加到通过管道发送到外部程序的内容,而 Bash 无法识别。
[1] 系统错误8为ENOEXECExec格式错误,表明虽然目标文件具有适当的执行权限,但其格式无法识别。这可能是由于文件损坏、作为错误平台的可执行文件或者(在当前的情况下)由于是缺少格式良好的 shebang 行的文本文件。
| 归档时间: |
|
| 查看次数: |
19420 次 |
| 最近记录: |