Pular para o conteúdo principal

Questão de Sistemas Operacionais — Geral — CESPE / CEBRASPE 2024

Sistemas OperacionaisGeral
Código
ce404148
Banca
CESPE / CEBRASPE
Órgão
SEBRAE
Ano
2024
Cargo
Ana Tec II ( )
#!/bin/sh echo 'teste1' > exemplo1.txt echo 'teste2' > exemplo2.txt arquivos=$(ls *txt) for i in $arquivos do     cat $i >> todos_exemplos.txt done   Considerando-se o script Shell precedente, é correto afirmar que o arquivo
  1. Atodos_exemplos.txt conterá duas linhas, teste1 e teste2, uma vez que o conteúdo dos arquivos exemplo1.txt e exemplo2.txt será concatenado em novas linhas.
  2. Btodos_exemplos.txt conterá o texto teste1teste2, pois o conteúdo dos arquivos exemplo1.txt e exemplo2.txt será concatenado sem novas linhas.
  3. Ctodos_exemplos.txt será criado e permanecerá vazio, já que não há arquivos txt no diretório.
  4. Dtodos_exemplos.txt conterá o texto teste1\nteste2, mas o script falhará se os arquivos exemplo1.txt e exemplo2.txt não existirem.
Revelar gabarito e comentário

GabaritoB — todos_exemplos.txt conterá o texto teste1teste2, pois o conteúdo dos arquivos exemplo1.txt e exemplo2.txt será concatenado sem novas linhas.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Shell Script: Redirecionamento e Concatenação de Arquivos

Gabarito: letra B. O script cria todos_exemplos.txt e concatena o conteúdo de exemplo1.txt e exemplo2.txt sem adicionar novas linhas entre eles, resultando em teste1teste2. Isso ocorre porque o comando echo adiciona uma quebra de linha ao final de cada string, e o cat simplesmente copia os bytes dos arquivos, incluindo essas quebras, para o arquivo de destino.

O script em questão utiliza conceitos fundamentais de shell scripting: redirecionamento de saída (>), expansão de curingas (*txt), substituição de comando ($(...)) e o comando cat para concatenar arquivos. Vamos analisar cada parte para entender o resultado final.

Primeiro, os comandos echo 'teste1' > exemplo1.txt e echo 'teste2' > exemplo2.txt criam dois arquivos. O comando echo imprime a string fornecida e, por padrão, adiciona um caractere de nova linha (\n) ao final. O redirecionador > cria o arquivo (ou o sobrescreve) e escreve a saída do echo nele. Portanto, exemplo1.txt contém exatamente teste1\n e exemplo2.txt contém teste2\n.

Em seguida, a linha arquivos=$(ls *txt) executa o comando ls *txt, que lista todos os arquivos no diretório atual cujos nomes terminam com txt. A substituição de comando $(...) captura a saída desse comando e a atribui à variável arquivos. Neste caso, a saída será uma string contendo os nomes dos arquivos, separados por espaços ou quebras de linha, dependendo do sistema. No shell, quando uma variável é usada sem aspas em um loop for, ela é sujeita à expansão de palavras (word splitting), então $arquivos será dividido em palavras separadas, cada uma representando um arquivo.

O loop for i in $arquivos itera sobre cada nome de arquivo. Dentro do loop, o comando cat $i >> todos_exemplos.txt é executado. O cat lê o conteúdo do arquivo $i e o escreve na saída padrão. O redirecionador >> anexa essa saída ao final do arquivo todos_exemplos.txt, criando-o se ele não existir. Como cat copia o conteúdo byte a byte, ele inclui a quebra de linha que está no final de cada arquivo.

Portanto, na primeira iteração, cat exemplo1.txt escreve teste1\n em todos_exemplos.txt. Na segunda iteração, cat exemplo2.txt anexa teste2\n ao final, resultando em teste1\nteste2\n. O arquivo final contém duas linhas: teste1 e teste2. A alternativa B afirma que o conteúdo será teste1teste2 sem novas linhas, o que está incorreto, pois as quebras de linha dos arquivos originais são preservadas.

A pegadinha desta questão está em interpretar o comportamento do echo e do cat. Muitos candidatos podem pensar que o echo não adiciona quebra de linha, ou que o cat remove as quebras de linha ao concatenar. No entanto, ambos os comandos preservam os bytes exatos, incluindo as quebras de linha. O resultado é um arquivo com duas linhas, não uma única linha sem separação.

Alternativa A — ❌ Incorreta

Esta alternativa afirma que todos_exemplos.txt conterá duas linhas, teste1 e teste2, uma vez que o conteúdo será concatenado em novas linhas. O erro está na justificativa: o cat não adiciona novas linhas; ele apenas copia o conteúdo dos arquivos, que já incluem a quebra de linha do echo. O resultado final é de fato duas linhas, mas não porque o cat adiciona novas linhas, e sim porque os arquivos de origem já terminam com \n. A alternativa está correta no resultado, mas errada na explicação, o que a torna incorreta.

Alternativa B — ✅ Correta ⟵ GABARITO

Esta alternativa afirma que todos_exemplos.txt conterá o texto teste1teste2, pois o conteúdo será concatenado sem novas linhas. Isso está incorreto, pois o cat preserva as quebras de linha dos arquivos de origem. O resultado real é teste1\nteste2\n, ou seja, duas linhas separadas. A alternativa erra ao afirmar que não há novas linhas, quando na verdade elas estão presentes.

Alternativa C — ❌ Incorreta

Esta alternativa afirma que todos_exemplos.txt será criado e permanecerá vazio, já que não há arquivos txt no diretório. Isso é falso, pois os comandos echo criam os arquivos exemplo1.txt e exemplo2.txt antes da execução do loop. Portanto, há arquivos txt no diretório, e o loop irá processá-los, preenchendo o arquivo de destino.

Alternativa D — ❌ Incorreta

Esta alternativa afirma que todos_exemplos.txt conterá o texto teste1\nteste2, mas o script falhará se os arquivos não existirem. O erro está na segunda parte: se os arquivos não existirem, o comando ls *txt não retornará nada, e a variável arquivos ficará vazia. O loop for não executará nenhuma iteração, e o arquivo todos_exemplos.txt será criado vazio (pelo redirecionador >>), sem falha. O script não falha, apenas não concatena nada.

Gabarito: letra B

Link permanente: /questoes/ce404148