Shell Script vs PowerShell: cópia de arquivos e portabilidade
Gabarito: letra B. O código em PowerShell pode ser executado diretamente no Windows, pois o PowerShell é um componente nativo do sistema operacional desde o Windows 7/Server 2008, enquanto o Bash é o interpretador padrão de sistemas Unix/Linux e, no Windows, exige a instalação de um ambiente adicional (como WSL, Git Bash ou Cygwin). As demais alternativas apresentam erros conceituais sobre o comportamento dos comandos Copy-Item e cp, sobre a criação de pastas e sobre a natureza das linguagens.
A questão compara dois scripts com a mesma finalidade: copiar arquivos .txt de uma pasta de origem para uma pasta de backup. O primeiro usa o cmdlet Copy-Item do PowerShell; o segundo usa o comando cp do Bash. A banca não quer que você decore a sintaxe exata de cada um, mas que compreenda as diferenças de ambiente, comportamento padrão e portabilidade entre as duas abordagens.
Vamos entender cada conceito envolvido. O PowerShell é um shell e linguagem de script desenvolvido pela Microsoft, integrado ao Windows. Ele é baseado no .NET Framework e seus comandos são chamados de cmdlets (como Copy-Item). O Bash (Bourne Again Shell) é o shell padrão da maioria das distribuições Linux e também está presente no macOS. No Windows, o Bash não é nativo — para executá-lo, é necessário instalar um ambiente Unix, como o Subsistema Windows para Linux (WSL), Git Bash ou Cygwin.
Sobre o comportamento dos comandos de cópia: tanto Copy-Item quanto cp são capazes de copiar arquivos e, com as opções adequadas, diretórios recursivamente. No PowerShell, Copy-Item -Recurse copia pastas e seu conteúdo; no Bash, cp -r faz o mesmo. A afirmação de que "não realizam cópia recursiva" é falsa, pois ambos possuem essa capacidade.
Quanto à criação de pastas: nem o Copy-Item nem o cp criam automaticamente o diretório de destino se ele não existir. No PowerShell, é necessário usar New-Item -ItemType Directory ou mkdir antes; no Bash, usa-se mkdir -p. Portanto, ambos os scripts podem falhar se a pasta de backup não existir, a menos que o código inclua explicitamente a criação do diretório.
Sobre segurança e sobrescrita: por padrão, tanto Copy-Item quanto cp sobrescrevem arquivos existentes no destino sem pedir confirmação. Para evitar a sobrescrita, seria necessário usar parâmetros como -NoClobber no PowerShell ou a opção -n/--no-clobber no Bash. Nenhum dos dois é intrinsecamente "mais seguro" nesse aspecto.
Por fim, sobre desempenho: o PowerShell é uma linguagem interpretada (baseada no .NET), assim como o Bash é interpretado. Nenhum dos dois é compilado. A afirmação de que o PowerShell é compilado é incorreta.
Agora, vamos analisar cada alternativa em detalhe.
Critério | PowerShell | Bash (Shell Script) |
|---|
Execução nativa no Windows | Sim (componente nativo desde Windows 7/Server 2008) | Não (exige WSL, Git Bash ou Cygwin) |
Criação automática da pasta de destino | Não (exige New-Item/mkdir prévio) | Não (exige mkdir -p prévio) |
Cópia recursiva | Suportada (Copy-Item -Recurse) | Suportada (cp -r) |
Sobrescrita sem confirmação (padrão) | Sim (sobrescreve; para evitar, usar -NoClobber) | Sim (sobrescreve; para evitar, usar -n/--no-clobber) |
Natureza da linguagem | Interpretada (baseada no .NET) | Interpretada |
Alternativa A — ❌ Incorreta
Afirma que o PowerShell pode gerar erro se a pasta de backup não existir, enquanto o Bash criaria a pasta automaticamente. Isso está errado: o comando cp do Bash não cria diretórios de destino automaticamente. Se a pasta não existir, o cp retorna um erro ("No such file or directory"). Para criar a pasta, seria necessário usar mkdir -p antes do cp. Portanto, ambos os scripts exigem que a pasta de destino exista ou que o código a crie explicitamente.
Alternativa B — ✅ Correta ⟵ GABARITO
Esta é a alternativa correta. O PowerShell é um componente nativo do Windows desde o Windows 7 e o Windows Server 2008 R2, portanto, um script .ps1 pode ser executado diretamente no Windows sem a necessidade de instalar software adicional (apenas é preciso ajustar a política de execução, se necessário). Já o Bash é o shell padrão de sistemas Unix/Linux; no Windows, para executar scripts .sh, é necessário instalar um ambiente Unix, como o WSL (Subsistema Windows para Linux), Git Bash ou Cygwin. Essa é a diferença central de portabilidade entre as duas linguagens.
Alternativa C — ❌ Incorreta
Afirma que ambos os scripts estão incorretos porque Copy-Item e cp não realizam cópia recursiva. Isso é falso: ambos os comandos suportam cópia recursiva. No PowerShell, o parâmetro -Recurse permite copiar diretórios e seu conteúdo; no Bash, a opção -r ou -R faz o mesmo. Além disso, a questão afirma que os scripts copiam apenas arquivos .txt de uma pasta — não há indicação de que seja necessária recursividade para subpastas. A alternativa parte de uma premissa incorreta.
Alternativa D — ❌ Incorreta
Afirma que o Bash é mais seguro que o PowerShell porque impede a sobrescrita de arquivos sem confirmação. Isso é incorreto: por padrão, tanto cp quanto Copy-Item sobrescrevem arquivos existentes no destino sem pedir confirmação. Para evitar a sobrescrita, seria necessário usar opções específicas: -NoClobber no PowerShell ou -n/--no-clobber no Bash. Nenhum dos dois é intrinsecamente mais seguro nesse aspecto; a segurança depende de como o script é escrito.
Alternativa E — ❌ Incorreta
Afirma que o PowerShell tem melhor desempenho que o Bash por ser uma linguagem compilada. Isso é falso: o PowerShell é uma linguagem interpretada, baseada no .NET Framework (o código é compilado em tempo de execução pelo CLR, mas a linguagem em si não é compilada em um executável nativo). O Bash também é interpretado. A afirmação sobre compilação está incorreta, e a relação de desempenho entre as duas linguagens não é uma característica definida pela compilação.
Gabarito: letra B — a única alternativa que apresenta uma afirmação correta sobre a portabilidade do PowerShell e do Bash no Windows.