… em terminais não se comportam exatamente como deveriam! Eis, a conclusão de Bobby Jack (editor do portal How-To Geek), que já havia se dado conta de que as implementações de comandos essenciais para a administração de sistemas Unix, não entregam os resultados esperados, como também possuem diferenças marcantes quanto ao seu modo de funcionamento. E olha que estamos falando de comandos que em tese, deveriam ser portáveis e (preferencialmente) utilizar a mesma base de códigos! Pois afinal de contas, estamos falando de softwares de código aberto…
“Any command you run in a Linux terminal will behave the same on all systems, right? Wrong. Although Linux commands are often highly portable, there can be exceptions. Individual commands can have different versions, like GNU’s find and BSD’s equivalent. Programs can also differ across versions of Unix, such as Solaris, IBM AIX, and macOS, or even distributions, like Alpine Linux’s BusyBox. (…) Although neither common set of tools is better than the other, BSD and GNU do have significant variations.”
— by How-To Geek.
Embora comandos executados em terminais Linux sejam frequentemente vistos como altamente portáteis, a consistência entre diferentes sistemas operacionais e distribuições pode falhar devido a variações nas implementações, como as ferramentas GNU (comuns para sistemas GNU/Linux) e as versões BSD (utilizadas no macOS e outros Unix). Ferramentas utilitárias como o stat exemplificam bem este cenário. Enquanto a versão GNU oferece suporte a opções longas como –help e permite formatos específicos para exibir propriedades de arquivos, a versão BSD utiliza flags e sintaxes totalmente diferentes para obter os mesmos resultados, o que pode quebrar scripts criados num ambiente e executados noutro.
A complexidade aumenta em ferramentas de busca e monitorização como o find e o top. No caso do find, as versões divergem até mesmo na terminologia interna e em funcionalidades práticas, como é o caso da opção -printf da versão GNU, que por sua vez é inexistente no ecossistema BSD. Já o comando top, responsável por listar processos ativos, apresenta saídas interativas com dados estruturados de forma distinta, variando na ordem das colunas e na exibição de métricas de memória (percentual na versão GNU versus valores absolutos na BSD), além de incluir informações adicionais de rede e disco nos sistemas baseados em BSD.
A manipulação de fluxos de texto com o sed e a filtragem com o grep também exigem cautela redobrada por parte dos usuários. Ao efetuar edições diretamente em um arquivo através da flag -i, o sed em sistemas BSD exige a definição de uma extensão para a criação de uma cópia de segurança (ou strings vazias como argumento), gerando erros de sintaxe confusos se for aplicada a sintaxe padrão do Linux. No caso do grep, a grande disparidade reside no suporte a “Expressões Regulares Compatíveis com Perl” (PCRE) através da opção -P, um recurso avançado e flexível presente na versão GNU que faz muita falta aos usuários de BSDs.
Até mesmo operações básicas de gestão de arquivos, ocultam inconsistências importantes que afetam a produtividade. O comando cp e a sua opção -u, é muito útil para copiar arquivos apenas quando estes são mais recentes do que os que estão no destino, funciona perfeitamente em distribuições como Ubuntu ou Debian, mas está ausente na versão nativa do macOS. Adicionalmente, a capacidade de inverter a ordem dos parâmetros usando a flag -t para facilitar o envio de múltiplos arquivos em pipelines de comandos, é um privilégio exclusivo da implementação desenvolvida pela GNU, o que não é o caso do macOS (baseado em BSD).
Para mitigar estes entraves e garantir o funcionamento correto de automações em ambientes híbridos, recomenda-se focar estritamente nos comportamentos definidos pelo padrão POSIX sempre que a compatibilidade for uma prioridade. Embora as ferramentas BSD se mantenham mais próximas dessa padronização formal, as extensões da GNU trazem conveniências inegáveis para o dia-a-dia. Compreender estas nuances e aprender a identificar qual a vertente utilitária em execução é um passo fundamental para qualquer utilizador que navegue entre diferentes ecossistemas de computação.
Este, é o principal motivo pelo qual NÃO gosto de criar/usar scripts… &;-D