bash: executa o comando dado na linha de comando e não sai

12

como eu especifico um comando no commmandline do bash que deve ser executado uma vez dentro do novo bash depois de ler ~ / .bashrc - Mas tudo isso sem deixar o bash sair após o término do comando?

Estou brincando com uma "configuração de inicialização" para o terminador onde algumas divisões devem começar alguns aplicativos (vim, mutt, irrsi) após a inicialização. Mas eu ainda quero shells normais em segundo plano (ctrl-z e assim por diante ...), então depois de sair de um aplicativo eu tenho o mesmo shell que eu tinha durante a vida útil das aplicações ...

O que não funciona para mim (com base em respostas dadas)

 ( bash; vim )              # vim waits for the exit of bash...
 bash -c vim                # bash exits after vims exit...
 bash -c 'vim; exec bash'   # bash is executed _after_ vim... ctrl-z won't work
 echo vim | bash -s         # "Vim: Warning: Input is not from a terminal"     

A adição manual do "vim" a um bashrc temporário também não funciona. O vim é iniciado corretamente, mas ainda não existe nenhum evento bash onde um ctrl-z me levaria.

Alguma sugestão?

    
por marvin2k 09.10.2011 / 00:29

5 respostas

4

Parece que encontrei uma maneira de resolver isso para que o controle do trabalho funcione:

bash --rcfile <(cat ${HOME}/.bashrc; echo 'export PROMPT_COMMAND="vim; export PROMPT_COMMAND="') -i

Isso cria um arquivo bashrc personalizado e usa a variável PROMPT_COMMAND para atrasar o início do Vim para que o controle de trabalho funcione. Isto, obviamente, pode ser generalizado para não ser específico do Vim.

Ok, apenas testei isso com o terminador e pelo menos parece funcionar com o arquivo de configuração:

[profiles]
[[default]]
    use_custom_command = True
    custom_command = "bash --rcfile <(cat ${HOME}/.bashrc; echo 'export PROMPT_COMMAND="vim; export PROMPT_COMMAND="') -i"
    
por 23.04.2013 / 13:31
2

(Ab) usando .bashrc é o único modo utilizável. 1 Geração é desnecessária, no entanto - basta colocar o (s) comando (s) em uma variável de ambiente e eval it:

  • Coloque o seguinte no final do seu ~/.bashrc :

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
    
  • Configure o Terminator para iniciar este comando:

    env startup_cmd='vim' bash
    

1 Vamos excluir os "use C4 para quebrar uma noz".

    
por 09.10.2011 / 01:09
1
bash -c 'vim; exec bash'

O exec bash substituirá a instância atual do Bash por uma nova.

    
por 09.10.2011 / 00:40
0

Eu tive esse mesmo problema no contexto de querer gerar o vim em uma janela do tmux com a habilidade de ctrl-z out. No final, eu não consegui descobrir como fazê-lo de forma limpa dentro do bash. Eu decidi o seguinte:

tmux new-session -d -s foo
tmux send-keys -t foo:0.0 "vim
"
    
por 02.01.2013 / 18:13
0
bash --rcfile <(cat ${HOME}/.bashrc; echo 'trap vim 12'; echo 'echo $$>/tmp/foo'; echo '( sleep 1;kill -12 '</tmp/foo'; )' ) -i

Obrigado ao usuário wor pelo " arquivo bashrc personalizado em tempo real "!

A outra parte crucial é " trap ", um bash-builtin:

  • O comando trap acima apenas define o vim para ser executado se o bash receber o sinal 12.
  • Colocado em segundo plano durante a execução do rcfile, um comando oculta kill -12 espera um segundo para que o bash possa concluir a inicialização. Se você omitir isso, um Ctrl-Z durante o vim não o colocaria em um shell funcionando .
  • Então o kill é executado e assim o vim é iniciado.
  • kill lê o ID do processo de / tmp / foo. Provavelmente existe uma maneira mais elegante.
  • Eu também testei o Ctrl-Z e ele funciona como esperado.

Eu não tenho ideia do que o "terminador" que você menciona é, a propósito.

Encontrei isso enquanto procurava por uma solução com bash e screen.

    
por 25.02.2015 / 19:05