Ante todo; una vez que haya comenzado un proceso, puede ponerlo en segundo plano deteniéndolo primero (presionar Ctrl- Z) y luego escribiendo bg
para permitir que se reanude en segundo plano. Ahora es un "trabajo", y su stdout
/ stderr
/ stdin
aún está conectado a su terminal.
Puede iniciar un proceso como fondo inmediatamente agregando un "&" al final del mismo:
firefox &
Para ejecutarlo en segundo plano silenciado, use esto:
firefox </dev/null &>/dev/null &
Alguna información adicional:
nohup
es un programa que puede usar para ejecutar su aplicación de tal manera que su stdout / stderr se pueda enviar a un archivo y que cerrar el script principal no haga SIGHUP al hijo. Sin embargo, debe haber tenido la previsión de haberlo usado antes de iniciar la aplicación. Debido a la forma en que nohup
funciona, no puede simplemente aplicarlo a un proceso en ejecución .
disown
es un bash incorporado que elimina un trabajo de shell de la lista de trabajos del shell. Lo que esto básicamente significa es que ya no puedes usarlo fg
, bg
pero lo más importante es que cuando cierras tu shell ya no se cuelga ni envía un mensaje SIGHUP
a ese niño. A diferencia nohup
, disown
se usa después de que el proceso se ha iniciado y se ha establecido en segundo plano.
Lo que no puede hacer es cambiar el stdout / stderr / stdin de un proceso después de haberlo lanzado. Al menos no desde la cáscara. Si inicia su proceso y le dice que su stdout es su terminal (que es lo que hace por defecto), entonces ese proceso está configurado para salir a su terminal. Su shell no tiene nada que ver con la configuración FD de los procesos, eso es puramente algo que el proceso en sí mismo administra. El proceso en sí mismo puede decidir si cierra su stdout / stderr / stdin o no, pero no puede usar su shell para forzarlo a hacerlo.
Para administrar la salida de un proceso en segundo plano, tiene muchas opciones de scripts, "nohup" probablemente sea el primero en pensar. Pero para los procesos interactivos que comienzas pero olvidaste silenciar ( firefox < /dev/null &>/dev/null &
) no puedes hacer mucho, realmente.
Te recomiendo que obtengas GNU screen
. Con la pantalla, puede cerrar su shell en ejecución cuando la salida del proceso se vuelve molesta y abrir una nueva ( ^Ac
).
Ah, y por cierto, no uses " $@
" donde lo estás usando.
$@
significa, $1
, $2
, $3
..., lo que convertiría a su comando en:
gnome-terminal -e "vim $1" "$2" "$3" ...
Probablemente eso no sea lo que quieres porque solo toma un argumento. Use $1
para mostrar que su script solo puede manejar un argumento.
Es realmente difícil hacer que varios argumentos funcionen correctamente en el escenario que proporcionó (con el gnome-terminal -e
) porque -e
solo toma un argumento, que es una cadena de comando de shell. Tendría que codificar sus argumentos en uno. La mejor y más robusta, pero bastante turbia, es así:
gnome-terminal -e "vim $(printf "%q " "$@")"