O que é o equivalente em Linux do CMD / K?

2

Existe um script de compilação .desktop, que precisa permanecer aberto após o término, caso haja erros que eu preciso corrigir. No Windows, eu executaria cmd /k script.bat , e o / k manteria uma janela cmd aberta após o término.

No Linux, minha solução é criar um script bash, que consiste no comando "compile" e no comando "bash". O arquivo .desktop invoca o script, que por sua vez permanece aberto após o término, devido ao comando bash.

Existe uma maneira de fazer isso com um único arquivo? Em caso afirmativo, preciso fazer um dos seguintes procedimentos com um único comando, por exemplo, por um argumento de linha de comando para bash:

  • Faça bash executar um comando antes de iniciar (equivalente ao comando cmd / k no Windows)

  • Faça o bash start em um determinado diretório (posso configurar a compilação para acionar quando o diretório for aberto)

  • Faça com que o arquivo .desktop permaneça aberto após a execução de seu comando (isso é o menos recomendável, já que precisaria de uma segunda janela aberta para corrigir erros, se houver algum)

Por favor, deixe-me saber se um deles é possível.

    
por Alex 07.01.2016 / 02:00

2 respostas

2

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

    
por 19.04.2017 / 09:09
0

Obrigado @skrebbel que é um comando muito útil, aqui estão os códigos de arquivo .reg para adicionar um menu de contexto de clique com Bash Console Here se você tiver Windows Subsystem para Linux

AddContext.reg:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\BashConsoleHere]
@="Bash Console Here"
"Icon"=hex(2):25,00,4c,00,4f,00,43,00,41,00,4c,00,41,00,50,00,50,00,44,00,41,\
  00,54,00,41,00,25,00,5c,00,6c,00,78,00,73,00,73,00,5c,00,62,00,61,00,73,00,\
  68,00,2e,00,69,00,63,00,6f,00,00,00

[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\BashConsoleHere\command]
@="bash -c 'exec bash --init-file <(echo \". \"$HOME/.bashrc\"\")'"

[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\shell\BashConsoleHere]
@="Bash Console Here"
"Icon"=hex(2):25,00,4c,00,4f,00,43,00,41,00,4c,00,41,00,50,00,50,00,44,00,41,\
  00,54,00,41,00,25,00,5c,00,6c,00,78,00,73,00,73,00,5c,00,62,00,61,00,73,00,\
  68,00,2e,00,69,00,63,00,6f,00,00,00

[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\shell\BashConsoleHere\command]
@="bash -c 'exec bash --init-file <(echo \". \"$HOME/.bashrc\"\")'"

[HKEY_CLASSES_ROOT\Drive\shell\BashConsoleHere]
@="Bash Console Here"
"Extended"=""
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\Drive\shell\BashConsoleHere\command]
@="bash -c 'exec bash --init-file <(echo \". \"$HOME/.bashrc\"\")'"

Undo.reg:

Windows Registry Editor Version 5.00

[-HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\BashConsoleHere]
@="Bash Console Here"
"Icon"=hex(2):25,00,4c,00,4f,00,43,00,41,00,4c,00,41,00,50,00,50,00,44,00,41,\
  00,54,00,41,00,25,00,5c,00,6c,00,78,00,73,00,73,00,5c,00,62,00,61,00,73,00,\
  68,00,2e,00,69,00,63,00,6f,00,00,00

[-HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\BashConsoleHere\command]
@="nircmd elevate cmd /c cd \"%V\" && bash.exe"

[-HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\shell\BashConsoleHere]
@="Bash Console Here"
"Icon"=hex(2):25,00,4c,00,4f,00,43,00,41,00,4c,00,41,00,50,00,50,00,44,00,41,\
  00,54,00,41,00,25,00,5c,00,6c,00,78,00,73,00,73,00,5c,00,62,00,61,00,73,00,\
  68,00,2e,00,69,00,63,00,6f,00,00,00

[-HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\shell\BashConsoleHere\command]
@="nircmd elevate cmd /c cd \"%1\" && bash.exe"

[-HKEY_CLASSES_ROOT\Drive\shell\BashConsoleHere]
@="Bash Console Here"
"Extended"=""
"NoWorkingDirectory"=""

[-HKEY_CLASSES_ROOT\Drive\shell\BashConsoleHere\command]
@="nircmd elevate cmd /c cd \"%1\" && bash.exe"
    
por 05.11.2017 / 15:01