Em primeiro lugar; uma vez iniciado um processo, pode primeiro pará-lo em segundo plano (clique em Ctrl-Z) e depois digitar bg
para que seja retomado em segundo plano. É agora um “trabalho”, e os seus stdout
/stderr
/stdin
ainda estão ligados ao seu terminal.
Pode iniciar imediatamente um processo em segundo plano anexando um “&” ao final do mesmo:
firefox &
Para o executar em segundo plano silenciado, use o seguinte:
firefox </dev/null &>/dev/null &
Algumas informações adicionais:
nohup
é um programa que pode utilizar ** para executar a sua aplicação com**, de modo a que a sua stdout/stderr possa ser enviada para um ficheiro e de modo a que o fecho do script dos pais não SIGHUPe a criança. No entanto, precisa de ter tido a previsão para o ter utilizado antes de iniciar a aplicação. Devido à forma como o nohup
funciona, não pode simplesmente aplicá-lo a um processo em execução.
disown
é uma construção bash que remove um trabalho da shell da lista de trabalhos da shell. O que isto basicamente significa é que já não pode usar o fg
, bg
nele, mas mais importante, quando fecha a sua shell já não é pendurado ou envia um SIGHUP
para aquela criança. Ao contrário do nohup
, o disown
é utilizado após o processo ter sido lançado e em segundo plano.
O que você can’t do, é alterar o stdout/stderr/stdin de um processo depois de o ter lançado. Pelo menos não a partir da casca. Se iniciar o seu processo e lhe disser que a stdout é o seu terminal (que é o que faz por defeito), então esse processo é configurado para sair para o seu terminal. A sua shell não tem negócios com a configuração FD dos processos, isso é apenas algo que o próprio processo gere. O processo em si pode decidir se fecha ou não a stdout/stderr/stdin, mas não pode usar a sua shell para o forçar a fazê-lo.
Para gerir a saída de um processo em segundo plano, tem muitas opções de scripts, sendo o “nohup” provavelmente o primeiro que lhe vem à cabeça. Mas para processos interactivos você começa mas esqueceu-se de silenciar (firefox < /dev/null &>/dev/null &
) você não pode fazer muito, realmente.
Eu recomendo que você obtenha o GNU screen
. Com o ecrã pode simplesmente fechar a sua shell quando a saída do processo se tornar um incómodo e abrir uma nova (^Ac
).
Oh, e já agora, não use “$@
” onde o está a usar.
$@
significa, $1
, $2
, $3
…, o que transformaria o 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 o seu script só pode lidar com um argumento.
É realmente difícil conseguir que vários argumentos funcionem correctamente no cenário que deu (com o gnome-terminal -e
) porque -e
leva apenas um argumento, que é uma string de comando shell. Você teria de codificar os seus argumentos num só. A melhor e mais robusta, mas um pouco desajeitada, maneira é assim:
gnome-terminal -e "vim $(printf "%q " "$@")"