我使用批处理文件和腻子自动执行 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 中运行
如果命令需要启动配置中的任何内容,则使用此版本。