bash: execute o comando fornecido na linha de comando e não saia


13

como eu especifico um comando na linha de comando 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 comando ser concluído?

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

O que não funciona para mim (com base nas 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"     

Anexar manualmente "vim" a um bashrc temporário também não funciona. O vim inicia corretamente, mas ainda não existe uma festança em segundo plano para onde um ctrl-z me levaria.

Alguma sugestão?

Respostas:


4

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

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

Isso cria um arquivo bashrc personalizado em tempo real e usa a variável PROMPT_COMMAND para atrasar o início do Vim, para que o controle do trabalho funcione. É claro que isso pode ser generalizado para não ser específico do Vim.

Ok, apenas testei isso com 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"

Muito obrigado. Eu prefiro unset PROMPT_COMMANDdo que export PROMPT_COMMAND=, no entanto.
Peque

2
bash -c 'vim; exec bash'

A exec bashsubstituirá a instância Bash atual com um novo.


1
hm sim ... isso resolver o problema "split vazio após a saída" ... mas Ctrl-Z ainda não funcionar - o bash é simplesmente executado novamente após VIMS saída ... Eu preciso vim dentro do bash
marvin2k

1
Eu tenho usado este formulário e só notei que ele não herda aliases etc. ao usar just exec bash. exec bash --loginajuda, mas, como observado, isso é executado dentro do bash, o que não é exatamente o que queremos.
Altendky # 22/15

Solução real. Não é feio. 1
Andrew

2

(Ab) usar .bashrcé a única maneira utilizável. 1 Geração é desnecessária - basta colocar o (s) comando (s) em uma variável de ambiente e eval:

  • 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".


parece bom e funciona à primeira vista ... tem que modificar o bashrc, poderia viver com isso ... mas, por qualquer motivo, o ctrl-z ainda não funciona - alguma ideia? - em que tipo de armário eu encontraria a solução baseada em c4?
Marvin2k

0

Eu tive esse mesmo problema no contexto de querer gerar o vim em uma janela do tmux com a capacidade de pressionar Ctrl-z. No final, não consegui descobrir como fazê-lo corretamente dentro do bash. Decidi o seguinte:

tmux new-session -d -s foo
tmux send-keys -t foo:0.0 "vim
"

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 é a " armadilha ", um bash-builtin:

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

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

Encontrei isso enquanto procurava uma solução com o bash e a tela.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.