Introdução
Na aula de hoje vamos falar sobre execução de
programas em primeiro plano (fg - foreground) e em segundo
plano (bg - background), redirecionamento de saídas e
também sobre os códigos de escape dos
programas.
Execução em foreground e
background
Quando executamos um programa, o shell fica esperando o
mesmo terminar para depois nos devolver a linha de comando.
Por exemplo, quando executamos o comando cp arquivo1
arquivo2,o shell executa esse comando, fica esperando ele
terminar, para depois nos retornar a linha de comando. Isso
chama-se execução em primeiro plano, ou foreground,
em inglês.Agora digamos que o arquivo a ser copiado seja
muito grande, digamos, 50Mb. Enquanto o comando cp é
executado, vamos ficar com o shell preso a ele todo esse
tempo, ou seja, cerca de 1 ou 2 minutos. Somente após
isso vamos ter a linha de comando de volta para podermos
continuar trabalhando.
E se pudéssemos dizer ao shell para executar um
programa e nos retornar a linha de comando sem ficar
esperando o tal programa terminar? Seria muito melhor,
não? Em alguns casos seria. E podemos fazer isso.
Uma maneira fácil é colocar o sinal de
&
depois de um comando. No exemplo acima ficaria:
neo@matrix:~$ cp arquivo1 arquivo2 &
[1] 206
neo@matrix:~$
Pronto, assim que teclarmos [enter], teremos a nossa linha
de comando de volta e mais duas informações: "[1]
206".
A primeira informação ([1]) chama-se job. Ela
identifica os programas que estão sendo executados em bg
(background). Por exemplo, se executarmos mais um programa em
bg enquanto este "cp" está sendo executado, o novo
programa recebe o job de número 2 ([2]) e assim por
diante.
A segunda informação (206) é o pid do
programa, ou seja, o número de processo que o kernel
dá a esse programa.
Mas aí temos um pequeno problema. Digamos que
você queira trazer o programa para fg, por exemplo, se o
programa executado em bg for um tocador de mp3 e você
quiser mudar a música. Como fazemos? Usamos o comando fg
[job] (intuitivo, não ?) do bash. No exemplo acima,
digamos que eu execute o "cp" em bg, mas depois queira
trazê-lo para fg para cancelá-lo. Seria
simples:
neo@matrix:~$ cp arquivo1 arquivo2 &
[1] 206
neo@matrix:~$ fg 1
cp arquivo1 arquivo2
Assim trazemos o "cp" para primeiro plano e a linha de
comando só retorna quando ele terminar.
Opcional
Uma outra maneira de colocar um programa para rodar em bg
é utilizando um truque do bash (não sei se esta
opção está disponível em outros
shells).Digamos que você execute o comando "cp" e
esqueça de colocar o sinal "&". E aí? Tem que
ficar esperando acabar ou cancelar o comando? Não,
podemos teclar: Ctrl + Z.
Ao fazer isso, paramos a execução do programa.
Então é só dar o comando bg [job] (intuitivo
também, né?):
neo@matrix:~$ cp arquivo1 arquivo2
* aqui teclamos Ctrl + Z *
[1]+ Stopped cp -i arquivo1 arquivo2
neo@matrix:~$ bg 1
[1]+ cp -i arquivo1 arquivo2 &
neo@matrix:~$
Quando teclamos o Ctrl + Z, o bash nos diz que o job 1 foi
parado ([1]+ Stopped) e quando executamos "bg 1" ele nos diz
que o comando voltou a ser executado, mas em bg (repare o
sinal de "&" no final da linha): [1]+ cp -i arquivo1
arquivo2 &.
|