Questão de Sistemas Operacionais — Scripts em Unix e Linux — CESPE / CEBRASPE 2024
- Código
- ce404125
- Banca
- CESPE / CEBRASPE
- Órgão
- CNJ
- Ano
- 2024
- Cargo
- TJ
- CCerto
- EErrado
GabaritoE — Errado
Gabarito: letra E (ERRADO). O operador >> no shell não cria um novo arquivo a cada iteração nem coloca o conteúdo na primeira linha — ele acrescenta (append) a saída ao final do arquivo, preservando o conteúdo já existente. O operador que cria/sobrescreve o arquivo do zero é o > (redirecionamento simples). A afirmação do item inverte o comportamento dos dois operadores, que é exatamente a pegadinha clássica da banca.
O redirecionamento de saída é um dos mecanismos mais fundamentais do shell Unix/Linux. Quando um comando é executado, ele produz saída padrão (stdout) e saída de erro (stderr). O shell permite direcionar essas saídas para arquivos, dispositivos ou outros comandos. Os dois operadores de redirecionamento de saída para arquivo são:
> — redireciona a saída para um arquivo, sobrescrevendo (truncando) o conteúdo existente. Se o arquivo não existe, ele é criado; se existe, seu conteúdo é apagado antes da escrita.
>> — redireciona a saída para um arquivo, acrescentando (append) ao final do conteúdo existente. Se o arquivo não existe, ele é criado; se existe, o novo conteúdo é adicionado após a última linha.
No script apresentado, o comando echo "$ip - $url" >> "$output_file" está dentro de um loop while que lê o arquivo de log linha por linha. A cada iteração, o echo produz uma linha de saída, e o >> a adiciona ao final do arquivo extracted_ips_and_urls.txt. Como o arquivo não é truncado a cada iteração, o resultado final é um arquivo com todas as linhas processadas, uma após a outra, na ordem em que foram lidas. Se fosse usado > no lugar de >>, o arquivo seria sobrescrito a cada iteração, e apenas a última linha processada permaneceria no arquivo.
Vamos ver um exemplo concreto para fixar. Suponha que o arquivo de log tenha três linhas:
192.168.1.1 - - [10/Out/2024:10:00:00] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [10/Out/2024:10:00:01] "GET /sobre.html HTTP/1.1" 200 5678
192.168.1.3 - - [10/Out/2024:10:00:02] "GET /contato.html HTTP/1.1" 404 9012Com o script usando >>, o arquivo de saída conterá, ao final da execução:
192.168.1.1 - /index.html
192.168.1.2 - /sobre.html
192.168.1.3 - /contato.htmlOu seja, três linhas, cada uma correspondente a uma iteração. Se o script usasse >, o arquivo conteria apenas a última linha (192.168.1.3 - /contato.html), pois cada iteração apagaria o conteúdo anterior.
A distinção entre > e >> é um dos pontos mais cobrados em provas de shell script, justamente porque a troca de um caractere muda completamente o comportamento do script. A banca explora essa confusão: o candidato que sabe que >> é "append" identifica imediatamente o erro na afirmação, enquanto o que confunde os operadores marca "certo".
A banca troca o comportamento do operador >> pelo do >. O >> acrescenta ao final do arquivo, preservando o conteúdo existente; o > sobrescreve o arquivo, apagando o conteúdo anterior. No script, como o >> está dentro de um loop, cada iteração adiciona uma nova linha ao final do arquivo — o resultado é um arquivo com todas as linhas processadas, não um arquivo novo a cada iteração. Fique atento: se a afirmação dissesse que o >> "acrescenta ao final do arquivo", estaria correta; mas ela diz que "cria um novo arquivo" e que o conteúdo "estará sempre na primeira linha", o que é falso.
A afirmação está errada por dois motivos:
O operador >> não cria um novo arquivo a cada iteração. Ele abre o arquivo uma única vez (na primeira iteração) e, nas iterações seguintes, reutiliza o mesmo descritor de arquivo, adicionando o conteúdo ao final. O arquivo não é recriado a cada iteração; ele é criado uma vez (se não existir) e depois apenas recebe acréscimos.
O conteúdo não fica "sempre na primeira linha". Como o >> acrescenta ao final, cada nova linha é adicionada após a última linha existente. O resultado é um arquivo com múltiplas linhas, uma para cada iteração do loop, na ordem em que foram processadas.
O comportamento descrito na afirmação (criar novo arquivo a cada iteração, com conteúdo na primeira linha) seria obtido com o operador > — e mesmo assim, o arquivo conteria apenas a última linha processada, não "sempre na primeira linha" de forma cumulativa. A afirmação mistura os dois operadores e ainda descreve um comportamento que nenhum deles produz exatamente como dito.
Conclusão: O item está ERRADO. O operador >> acrescenta ao final do arquivo, preservando o conteúdo existente, e o script produz um arquivo com todas as linhas processadas, uma após a outra. A alternativa correta é a letra E.
Gabarito: letra E
Link permanente: /questoes/ce404125