在 Windows 上使用命令批处理文件打开 Ubuntu 终端?

在 Windows 上使用命令批处理文件打开 Ubuntu 终端?

我使用批处理文件和腻子自动执行 Windows 上的许多进程。

例如(login_server7.bat):

start C:\Users\Jack\Documents\putty.exe -ssh 1.1.1.1 -l user123 -pw "bleh"

如何在打开文件后启动 Ubuntu 终端并自动运行命令?

而不是手动打开 ubuntu 终端并输入我的命令?

无法在其他地方看到关于此主题的任何内容。问候

答案1

WSL 的可执行文件是C:\Windows\System32\wsl.exe。您只需wsl在 Windows 命令提示符中输入,即可登录到默认的 WSL 实例。或者输入wsl -h以获取所有可用选项的列表。在批处理文件中,您可以使用:

C:\Windows\System32\wsl.exe <your script or command>

或者如果您需要以 root 身份运行该命令:

C:\Windows\System32\wsl.exe sudo <your script or command>

也许更正确的方法是使用wsl -e -- <command>,但上面的方法对我来说效果很好。以下是更详细的例子:Ubuntu 18.04 在 WSL 上的 cron 守护程序在重启后未运行

答案2

正如ps4080的回答所提到的,正确的方法是wsl -e -- <command>(或者,通常是wsl -e <command>)。

然而,在使用此技术时,您实际上可能会遇到相当多的细微差别,并且最好了解每个确切咒语的含义,以便您可以在需要时使用正确的咒语:

wsl <command>

  • 运行当前用户的默认 shell
  • ... 作为非登录、非交互式 shell
  • ... 在所属 Windows 进程传入的目录中
  • <command>在该 shell 中运行

根据您的 shell,您可以使用以下命令查看wsl ps -eH

  PID TTY          TIME CMD
    1 ?        00:00:00 init
   18 ?        00:00:00   init
   19 ?        00:00:00     init
   20 pts/0    00:00:00       fish
   28 pts/0    00:00:00         ps

bash请注意,当您的默认 shell 是时很难看到这一点,因为-c会导致隐式的exec

事实上,它在所属 Windows 进程的目录中运行,这很方便,因为您可以执行以下操作:

wsl ls -lh

...在 PowerShell 中获取“人类可读”的文件大小,这是出乎意料地困难否则。

其中最棘手的部分是第二个限定符。当以这种方式启动时,WSL 会将您的 shell 作为非登录、非交互式 shell 运行。这意味着~/.bashrc~/.bash_profile不是在启动时获取。当尝试运行需要在启动文件中执行某些操作的命令(例如设置环境变量)时,这可能会造成混淆。

wsl -e <command>

  • 运行<command> 作为贝壳
  • ... 在所属进程传入的目录中

完全-e绕过你的默认 shell。

> wsl ps -eH
  PID TTY          TIME CMD
    1 ?        00:00:00 init
    7 ?        00:00:00   init
    8 ?        00:00:00     init
    9 pts/0    00:00:00       ps

这可以是轻微地由于您避免了 shell 的启动开销,因此效率更高,但通常不值得担心。

wsl -e bash -lic <command>

  • 作为你的 shell运行bash(无论它是否是默认 shell)
  • 强制它成为一个登录的交互式 shell ( -li),以便获取~/.bashrc和(和/或其他)~/.bash_profile
  • ... 在所属 Windows 进程传入的目录中
  • <command>在该 shell 中运行

如果命令需要启动配置中的任何内容,则使用此版本。

相关内容