Eu encontrei um caminho. Eu peguei de algum site stackexchange mas não consigo encontrá-lo de volta.
De qualquer forma: Você pode abusar da opção --init-file
do bash. Destina-se a substituir usando algum outro script de inicialização em vez de .bashrc, mas você pode colocar qualquer coisa lá. Combinado com pipes anônimos, você pode fazer algo assim:
bash --init-file <(echo "your --command --here")
Depois que o comando terminar, você será colocado de volta no bash - não uma nova instância do bash como em algumas outras soluções, mas na mesma instância.
Agora, isso vai pular o .bashrc, é claro, porque é para isso que o --init-file
serve. Para consertar isso, você obtém o tremendamente bonito
bash --init-file <(echo ". \"$HOME/.bashrc\"; your --command --here")
Feio, mas funciona: -)
No subsistema Windows para Linux
Por fim, tentei fazer isso no Windows, mas tive problemas porque quando você inicia bash
para invocar o Windows Subsystem para Linux, você ainda está no Windows e os pipes anônimos venceram. t trabalho, $ HOME está tudo errado, e assim por diante. Minha solução alternativa para "cmd / k, mas para iniciar o subsistema windows para linux" tornou-se:
bash -c 'exec bash --init-file ^<(echo ". \"$HOME/.bashrc\"; your --command --here")'
Observe o ^
para escapar do caractere <
. Isso iniciará o bash ( bash -c
), substituirá imediatamente o atual processo bash por um novo ( exec
), que também é um processo bash, agora inicializado como discutido anteriormente, de dentro do Linux.
Eu fiz um arquivo de lote chamado bash-k.cmd
no meu PATH para que eu possa invocá-lo facilmente, com isso dentro dele:
@bash -c 'exec bash --init-file ^<(echo ". \"$HOME/.bashrc\"; %*")'
Isso me permite fazer bash-k cowsay hello
e as coisas funcionarão