Em primeiro lugar; Depois de iniciar um processo, você pode colocá-lo em segundo plano, primeiro parando-o (pressionar Ctrl- Z) e digitando bg
para deixá-lo retomar em segundo plano. Agora é um "trabalho" e seu stdout
/ stderr
/ stdin
ainda está conectado ao seu terminal.
Você pode iniciar um processo como segundo plano imediatamente anexando um "&" ao final dele:
firefox &
Para executá-lo em segundo plano silenciado, use o seguinte:
firefox </dev/null &>/dev/null &
Algumas informações adicionais:
nohup
é um programa que você pode usar para executar seu aplicativo, de modo que seu stdout / stderr possa ser enviado para um arquivo e que o fechamento do script pai não SIGHUP o filho. No entanto, você precisa ter a previsão de usá-lo antes de iniciar o aplicativo. Por causa da maneira como nohup
funciona, você não pode simplesmente aplicá-lo a um processo em execução .
disown
é um bash interno que remove um trabalho de shell da lista de trabalhos do shell. O que isto significa, basicamente, é que você não pode usar fg
, bg
no mais, mas o mais importante, quando você fecha o shell não irá travar ou enviar uma SIGHUP
para aquela criança mais. Ao contrário nohup
, disown
é usado após o processo ser iniciado e em segundo plano.
O que você não pode fazer é alterar o stdout / stderr / stdin de um processo depois de iniciá-lo. Pelo menos não da casca. Se você iniciar o seu processo e informar que o stdout é o seu terminal (que é o que você faz por padrão), esse processo está configurado para gerar saída para o seu terminal. Seu shell não se importa com a configuração de FD dos processos, isso é algo que o próprio processo gerencia. O processo em si pode decidir se deseja fechar seu stdout / stderr / stdin ou não, mas você não pode usar seu shell para forçá-lo a fazê-lo.
Para gerenciar a saída de um processo em segundo plano, você tem muitas opções de scripts, "nohup" provavelmente sendo o primeiro a se lembrar. Mas para processos interativos você inicia, mas esquece de silenciar ( firefox < /dev/null &>/dev/null &
), na verdade não pode fazer muito.
Eu recomendo que você obtenha o GNU screen
. Com a tela, você pode fechar o shell em execução quando a saída do processo se tornar um incômodo e abrir um novo ( ^Ac
).
Ah, e a propósito, não use " $@
" onde você estiver usando.
$@
significa, $1
, $2
, $3
..., que iria transformar o seu comando em:
gnome-terminal -e "vim $1" "$2" "$3" ...
Provavelmente não é isso que você quer, porque -e leva apenas um argumento. Use $1
para mostrar que seu script pode lidar apenas com um argumento.
É realmente difícil fazer com que vários argumentos funcionem corretamente no cenário que você forneceu (com o gnome-terminal -e
) porque -e
leva apenas um argumento, que é uma sequência de comandos do shell. Você teria que codificar seus argumentos em um. A maneira melhor e mais robusta, mas bastante desajeitada, é a seguinte:
gnome-terminal -e "vim $(printf "%q " "$@")"