Questão de Sistemas Operacionais — Scripts em Unix e Linux — VUNESP 2023
- Código
- vu197296
- Banca
- VUNESP
- Órgão
- UNICAMP
- Ano
- 2023
- Cargo
- PTIC ( )
- Aexec.sh &
- Bexec.sh &&
- Cexec.sh |
- Dexec.sh ||
- Eexec.sh ~
GabaritoA — exec.sh &
Gabarito: letra A. Para executar um arquivo shell script em background no terminal Linux, basta adicionar o caractere & (e comercial) ao final do comando, como em exec.sh &. Esse operador faz o shell não aguardar a conclusão do processo, devolvendo o prompt imediatamente ao usuário — comportamento descrito na literatura de sistemas operacionais como a forma de iniciar uma tarefa em segundo plano.
O shell (interpretador de comandos) é o programa que intermedeia a interação entre o usuário e o kernel. Quando você digita um comando, o shell cria um processo filho para executá-lo e, por padrão, espera que esse processo termine antes de exibir um novo prompt. Esse comportamento é chamado de execução em primeiro plano (foreground). Para liberar o terminal e continuar trabalhando enquanto o script roda, é preciso executá-lo em segundo plano (background), o que é feito justamente com o operador &.
O trecho abaixo, extraído de um clássico livro de sistemas operacionais, explica exatamente esse mecanismo:
Sistemas Operacionais Modernos (Tanenbaum):
"Se um usuário coloca um & após um comando, o shell não espera que ele termine. Em vez disso, ele dá um prompt imediatamente. Em consequência,
cat file1 file2 file3 | sort >/dev/lp &inicia o sort como uma tarefa de segundo plano, permitindo que o usuário continue trabalhando normalmente enquanto o ordenamento prossegue."
Na prática, ao digitar exec.sh &, o shell inicia o script como um processo em background e retorna o controle ao terminal. O usuário pode, então, digitar outros comandos normalmente. O processo continua rodando até terminar, e o shell informa seu PID (identificador de processo) para que o usuário possa gerenciá-lo (por exemplo, com kill).
É importante distinguir o & de outros operadores que também aparecem nas alternativas, pois cada um tem uma função completamente diferente:
Operador | Função | Exemplo |
|---|---|---|
| Executa o comando em background (segundo plano) |
|
| Executa o segundo comando somente se o primeiro tiver sucesso |
|
| Conecta a saída de um comando à entrada de outro (pipe) |
|
| Executa o segundo comando somente se o primeiro falhar |
|
| Representa o diretório home do usuário |
|
A pegadinha desta questão é justamente a confusão entre & (background) e && (E lógico). A banca troca um caractere e muda completamente o significado: && não tem nada a ver com segundo plano — é um operador de controle que encadeia comandos condicionalmente. O candidato que não domina esses operadores pode facilmente marcar a alternativa B, achando que o && é a forma de "executar em background".
Guarde a fronteira: & = background; && = E lógico; | = pipe; || = OU lógico; ~ = home. É exatamente nessa distinção que as alternativas se dividem.
O comando exec.sh & executa o script em background. O & ao final instrui o shell a não aguardar a conclusão do processo, devolvendo o prompt imediatamente. É exatamente o que o enunciado pede.
exec.sh && é um comando incompleto e semanticamente errado. O operador && é um E lógico que exige um segundo comando após ele (ex.: exec.sh && echo ok). Sozinho, ele não executa nada em background — na verdade, sem o segundo comando, o shell nem executa o script, pois && aguarda o próximo comando para decidir se o executa. A banca troca & por && para confundir quem não domina os operadores de controle.
exec.sh | é um pipe incompleto. O | conecta a saída padrão de um comando à entrada padrão de outro (ex.: exec.sh | grep erro). Sozinho, sem um segundo comando, ele não tem função e não executa o script em background. O pipe é usado para encadear comandos, não para segundo plano.
exec.sh || é um OU lógico incompleto. O || executa o segundo comando somente se o primeiro falhar (ex.: exec.sh || echo falhou). Sozinho, não tem efeito e não executa o script em background. É o oposto do &&: enquanto && exige sucesso, || exige falha.
exec.sh ~ usa o til (~), que representa o diretório home do usuário (ex.: cd ~). Ele não é um operador de execução nem de background. Colocá-lo após o nome do script não tem efeito algum — o shell tentaria executar exec.sh com um argumento ~, o que não é o que se deseja.
A banca explora a troca de & por &&. O candidato que confunde os dois marca a letra B, achando que o && é a forma de "executar em background". Lembre-se: & é o operador de segundo plano; && é o E lógico que encadeia comandos condicionalmente. Com treino, você enxerga essas trocas de longe 💪.
Para fixar, decore a tabela dos operadores do shell: & (background), && (E lógico), | (pipe), || (OU lógico), ~ (home). Em provas, quando a questão pedir "executar em background", procure o & sozinho — nunca acompanhado de outro &.
Gabarito: letra A
Link permanente: /questoes/vu197296