bash: ejecuta el comando dado en la línea de comando y no salgas


13

¿Cómo especifico un comando en la línea de comando de bash que se ejecutará una vez dentro del nuevo bash después de leer ~ / .bashrc - Pero todo esto sin dejar que bash salga después de que el comando haya terminado?

Estoy jugando con una "configuración de arranque" para el terminador donde algunas divisiones deberían iniciar algunas aplicaciones (vim, mutt, irrsi) después del inicio. Pero todavía quiero shells normales en segundo plano (ctrl-z y así sucesivamente ...) así que después de salir de una aplicación tengo el mismo shell que tuve durante la vida de las aplicaciones ...

Lo que no funciona para mí (según las respuestas 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"     

Agregar manualmente "vim" a un bashrc temporal tampoco funciona. vim se inicia correctamente, pero todavía no hay un fondo de bash presente donde un ctrl-z me lleve.

¿Alguna sugerencia?

Respuestas:


4

Parece que he encontrado una manera de resolver esto para que el control de trabajo funcione:

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

Esto crea un archivo bashrc personalizado sobre la marcha y utiliza la variable PROMPT_COMMAND para retrasar el inicio de Vim para que el control del trabajo funcione. Esto, por supuesto, puede generalizarse para no ser específico de Vim.

Ok, acabo de probar esto con el terminador y al menos parece funcionar con el archivo de configuración:

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

Muchas gracias. Sin embargo, prefiero en unset PROMPT_COMMANDlugar de hacerlo export PROMPT_COMMAND=.
Peque

2
bash -c 'vim; exec bash'

El exec bashsustituirá a la instancia Bash actual por uno nuevo.


1
hm sí ... esto resuelve el problema de "división vacía después de la salida" ... pero ctrl-z todavía no funciona - bash simplemente se ejecuta nuevamente después de la salida de vims ... Necesito vim dentro de bash
marvin2k

1
He estado usando este formulario y me di cuenta de que no hereda alias, etc. cuando se usa solo exec bash. exec bash --loginayuda, pero como se señaló, esto ejecuta bash dentro de bash, que no es realmente lo que queremos.
altendky

Solución real No está feo. +1
Andrew

2

(Ab) usar .bashrces la única forma utilizable. Sin embargo, la generación 1 es innecesaria: simplemente coloque los comandos en una variable de entorno y eval:

  • Ponga lo siguiente al final de su ~/.bashrc:

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

    env startup_cmd='vim' bash

1 Excluyamos los de "usar C4 para romper una nuez".


se ve bien y funciona a primera vista ... tengo que modificar bashrc, podría vivir con eso ... pero por alguna razón, ctrl-z todavía no funciona, ¿alguna idea? - ¿En qué tipo de armario encontraría la solución basada en c4?
marvin2k

0

Tuve este mismo problema en el contexto de querer generar vim en una ventana tmux con la capacidad de ctrl-z. Al final, no pude descubrir cómo hacerlo limpiamente dentro de bash. Me decidí por lo siguiente:

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

¡Gracias al usuario wor por el " archivo bashrc personalizado sobre la marcha "!

La otra parte crucial es " trap ", un bash-builtin:

  • El comando trap anterior solo define vim que se ejecutará si el bash recibe la señal 12.
  • Puesto en segundo plano durante la ejecución de rcfile, un comando kill -12 al acecho espera un segundo para que bash pueda finalizar la inicialización. Si omite esto, un Ctrl-Z durante vim no lo colocaría en un shell de trabajo .
  • Luego se ejecuta kill y, por lo tanto, se inicia vim.
  • kill lee la identificación del proceso desde / tmp / foo. Probablemente hay una forma más elegante.
  • También probé Ctrl-Z y funciona como se esperaba.

No tengo idea de cuál es el "terminador" que mencionas, por cierto.

Encontré esto mientras buscaba una solución con bash y pantalla.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.