En primer lugar; una vez que has iniciado un proceso, puedes ponerlo en segundo plano deteniéndolo primero (presiona Ctrl-Z) y luego escribiendo bg
para que se reanude en segundo plano. Ahora es un “trabajo”, y su stdout
/stderr
/stdin
sigue conectado a su terminal.
Puede iniciar un proceso como fondo inmediatamente añadiendo un “&” al final del mismo:
firefox &
Para ejecutarlo en el fondo silenciado, use esto:
firefox </dev/null &>/dev/null &
Alguna información adicional:
nohup
es un programa con el que puedes usar para ejecutar tu aplicación con de tal manera que su stdout/stderr pueda ser enviado a un archivo en su lugar y de tal manera que al cerrar el script padre no se SIGNIFIQUE el hijo. Sin embargo, tienes que haber tenido la previsión de usarlo antes de iniciar la aplicación. Debido a la forma en que nohup
funciona, no puedes simplemente aplicarlo a un proceso en ejecución.
disown
es un bash builtin que elimina un trabajo de la shell de la lista de trabajos de la shell. Lo que esto significa básicamente es que ya no puedes usar fg
, bg
en él, pero lo más importante, cuando cierras tu shell ya no se colgará o enviará un SIGHUP
a ese niño. A diferencia de nohup
, disown
se usa después de que el proceso se ha lanzado y se ha puesto en segundo plano.
Lo que no puedes hacer es cambiar la stdout/stderr/stdin de un proceso después de haberlo lanzado. Al menos no desde el shell. Si lanza su proceso y le dice que su stdout es su terminal (que es lo que hace por defecto), entonces ese proceso está configurado para dar salida a su terminal. Su shell no tiene nada que ver con la configuración de la FD de los procesos, eso es algo que el propio proceso gestiona. El proceso mismo puede decidir si cerrar su stdout/stderr/stdin o no, pero no puede usar su shell para forzarlo a hacerlo.
Para manejar la salida de un proceso en segundo plano, tiene muchas opciones de scripts, siendo “nohup” probablemente la primera que se le ocurre. Pero para los procesos interactivos que empiezas pero olvidaste silenciar (firefox < /dev/null &>/dev/null &
) no puedes hacer mucho, realmente.
Te recomiendo que consigas GNU screen
. Con la pantalla puedes simplemente cerrar tu shell en ejecución cuando la salida del proceso se convierte en una molestia y abrir uno nuevo (^Ac
).
Oh, y por cierto, no uses “$@
” donde lo estás usando.
$@
significa, $1
, $2
, $3
…, lo que convertiría tu comando en:
gnome-terminal -e "vim $1" "$2" "$3" ...
Eso probablemente no es lo que quieres porque -sólo toma un argumento. Usa $1
para mostrar que tu script sólo puede manejar un argumento.
Es realmente difícil hacer que varios argumentos funcionen correctamente en el escenario que diste (con el gnome-terminal -e
) porque -e
toma sólo un argumento, que es una cadena de comandos de shell. Tendrías que codificar tus argumentos en uno solo. La mejor y más robusta, pero más bien torpe, manera es así:
gnome-terminal -e "vim $(printf "%q " "$@")"