如何自动从 Windows 向 Linux(WSL/Ubuntu)发送命令?

如何自动从 Windows 向 Linux(WSL/Ubuntu)发送命令?

我想通过运行 Ubuntu 20 的 WSL 自动编译我的 Linux 程序,这样我就可以在 Windows 端设置一个 IDE 任务,它将在 Linux 上为我进行编译。我想制作一个 win32 应用程序来启动 Ubuntu 可执行文件并将命令发送到其 stdin,就像我手动输入一样,但由于 Ubuntu 是 UWP,我认为这是不可能的?自动化脚本的参数将是主源文件目录的路径、主源文件名以及 1 到 4-5 个其他开关。我希望自动化是无声的。自动化命令示例:

cd /mnt/<provided path>
compiler -switch1 -switch2 -switch3 -out <provided executable file name> <provided source file name>

由于在 .bashrc 中设置了环境变量,因此可以从任何地方访问编译器。

答案1

说实话,我投了赞成票答案bash.exe浏览得太快,才意识到它推荐的是(过时的)bash.exe。所以我将提供我希望的“更好的答案”。

请注意,bash.exeMicrosoft 将其列为“历史性命令”,在我看来,这仅比“弃用”高出一步。

目前启动 WSL 实例的推荐方式是使用wsl.exe命令(或仅wsl当从 PowerShell、CMD 或任一解释器下的脚本调用时)。例如(使用bash.exe上一个问题的示例):

给定一个文件/mnt/c/Temp/your_script.sh(当然设置为可执行文件),包含:

#!/usr/bin/env bash
echo Hello
cd /home
pwd

然后wsl -e "/mnt/c/Temp/your_script.sh"(在 PowerShell 中)将执行该文件并导致:

Hello
/home

-ewsl 的(also )参数--exec运行其后的任何命令作为默认 shell。因此,wsl -e ls无需调用bash(甚至sh) 即可列出目录。

shebang-in-a-script 方法是运行命令的一种方法之内 bash,但您也可以调用一个或多个命令,例如:

wsl -e bash -c "echo Hello; cd /home; pwd"

但请注意:

echo "echo Hello; cd /home; pwd" | wsl

将要不是至少在 PowerShell 中是这样,因为 PowerShell 有一个烦人的“功能”,即在\r通过管道传输到控制台可执行文件(如)的任何输出后附加回车符 ( ) wsl.exe

除其他功能外,wsl.exe还可以:

  • 如果你安装了多个发行版或实例,则在不同的 WSL 实例中启动或运行命令(例如wsl -d kali
  • 以不同用户身份启动或运行命令(无需密码)(例如wsl -u root visudo

答案2

WSL 使从其他环境运行应用程序变得非常容易 - 双向运行。在 Windows 中,您可以C:\Windows\System32\bash.exe使用 WSL GNU/Linux 中的 Bash 启动任何命令。

例如-脚本:

c:\Windows\System32\bash.exe -c "/mnt/c/Temp/your-bash-cmd.sh"

type C:\Temp\your-bash-cmd.sh | c:\Windows\System32\bash.exe

或者运行命令:

c:\Windows\System32\bash.exe -c "ls -al ; echo DONE"

请注意使用适合每个环境的正确文件系统路径,并且从 Windows 传递到 Bash 的脚本需要使用 Linux 换行符进行编码。

相关内容