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