Primeiro de tudo; Uma vez que você iniciou um processo, você pode fazer o background parando-o primeiro (tecle Ctrl - Z ) e então 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 antecedido imediatamente anexando um "&" até o fim:
firefox &
Para executá-lo em segundo plano silenciado, use isto:
firefox </dev/null &>/dev/null &
Algumas informações adicionais:
nohup
é um programa que você pode usar para executar seu aplicativo com de modo que seu stdout / stderr possa ser enviado para um arquivo e tal que fechar o script pai não irá SIGHUP o filho . No entanto, você precisa ter a perspicácia de usá-lo antes de iniciar o aplicativo. Por causa da maneira como o nohup
funciona, você não pode simplesmente aplicá-lo a um processo em execução .
disown
é um bash embutido que remove um trabalho de shell da lista de trabalhos do shell. O que isso basicamente significa é que você não pode mais usar fg
, bg
, mas o mais importante, quando você fechar seu shell, ele não irá mais travar ou enviar um SIGHUP
para aquela criança. Ao contrário de nohup
, disown
é usado após o processo foi iniciado e em segundo plano.
O que você não pode fazer é alterar o stdout / stderr / stdin de um processo depois de tê-lo lançado. Pelo menos não da casca. Se você iniciar seu processo e informar que seu stdout é seu terminal (que é o que você faz por padrão), então esse processo é configurado para saída para seu terminal. Seu shell não tem nenhum negócio com a configuração do FD dos processos, que é puramente 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 ser lembrado. Mas para processos interativos que você começa, mas esqueceu de silenciar ( firefox < /dev/null &>/dev/null &
) você não pode fazer muito, realmente.
Eu recomendo que você receba o GNU screen
. Com a tela, você pode apenas fechar seu 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ê está usando.
$@
significa, $1
, $2
, $3
..., o que transformaria seu comando em:
gnome-terminal -e "vim $1" "$2" "$3" ...
Isso provavelmente não é o que você quer porque -e só aceita um argumento. Use $1
para mostrar que seu script pode manipular apenas um argumento.
É realmente difícil obter vários argumentos funcionando corretamente no cenário que você forneceu (com gnome-terminal -e
) porque -e
aceita apenas um argumento, que é uma cadeia de comando do shell. Você teria que codificar seus argumentos em um. O melhor e mais robusto, mas um tanto áspero, é assim:
gnome-terminal -e "vim $(printf "%q " "$@")"