Eu automatizo muitos processos no Windows usando arquivos em lote e massa.
Por exemplo ( login_server7.bat ):
start C:\Users\Jack\Documents\putty.exe -ssh 1.1.1.1 -l user123 -pw "bleh"
Como posso iniciar um terminal Ubuntu e executar um comando automaticamente após abrir um arquivo?
Em vez de abrir manualmente o terminal do Ubuntu e digitar meus comandos?
Não consigo ver nada em outro lugar sobre este tópico. Cumprimentos
Responder1
O executável do WSL é C:\Windows\System32\wsl.exe
. Você pode simplesmente digitar wsl
no prompt de comando do Windows e estará conectado à instância WSL padrão. Ou digite wsl -h
para obter a lista de todas as opções disponíveis. Em arquivos em lote você pode usar:
C:\Windows\System32\wsl.exe <your script or command>
Ou se você precisar executar o comando como root:
C:\Windows\System32\wsl.exe sudo <your script or command>
Provavelmente a maneira mais correta é usar wsl -e -- <command>
, mas o procedimento acima funciona bem para mim. Aqui está um exemplo mais detalhado:Ubuntu 18.04 no daemon cron WSL não funciona após a reinicialização.
Responder2
Como ps4080
a resposta menciona, a maneira certa de fazer isso é wsl -e -- <command>
(ou normalmente wsl -e <command>
).
No entanto, existem algumas nuances que você pode encontrar com esta técnica, e é bom entender o que está acontecendo com cada encantamento exato para que você possa usar o correto quando necessário:
wsl <command>
- Executa o shell padrão para o usuário atual
- ... como um shell não interativo e sem login
- ... no diretório passado pelo processo proprietário do Windows
- Executa
<command>
nesse shell
Dependendo do seu shell, você pode ver isso com 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
Observe que é difícil ver isso quando bash
é seu shell padrão, pois -c
resulta em um arquivo exec
.
O fato de ser executado no diretório do processo proprietário do Windows pode ser útil, pois você pode fazer:
wsl ls -lh
... no PowerShell para obter tamanhos de arquivo "legíveis por humanos", algo que ésurpreendentemente difícil de fazerde outra forma.
A parte mais complicada disso é a segunda qualificação. WSL executa seu shell como um shell sem login e não interativo quando iniciado dessa maneira. Isso significa que ~/.bashrc
e ~/.bash_profile
sãonãooriginado na inicialização. Isto pode causar confusão ao tentar executar um comando que requer que algo seja feito nos arquivos de inicialização (por exemplo, definir uma variável de ambiente).
wsl -e <command>
- Corre
<command>
comoA concha - ... no diretório passado pelo processo proprietário
O -e
ignora completamente o seu shell padrão.
> 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
Isso pode serum poucomais eficiente, pois evita a sobrecarga de inicialização do shell, mas normalmente não vale a pena se preocupar.
wsl -e bash -lic <command>
- Executa
bash
como seu shell (independentemente de ser o shell padrão ou não) - Força que seja um login, shell interativo (
-li
) para que~/.bashrc
e~/.bash_profile
(e/ou outros) sejam originados - ... no diretório passado pelo processo proprietário do Windows
- Executa
<command>
nesse shell
Esta é a versão a ser usada se o comando precisar de alguma coisa da sua configuração de inicialização.