Todas as variações da linguagem shell Bourne são objetivamente terríveis em comparação com as linguagens de script modernas, como Perl, Python, Ruby, node.js e até Tcl (sem dúvida). Se você precisar fazer algo um pouco complicado, ficará mais feliz a longo prazo se usar um dos itens acima em vez de um shell script.
A única vantagem que a linguagem shell ainda tem sobre as linguagens mais recentes é que algo que se chama /bin/sh
é garantido que existe em qualquer coisa que pretenda ser Unix. No entanto, esse item pode até não ser compatível com POSIX; muitos dos Unixes proprietários herdados congelaram o idioma implementado pelo /bin/sh
e pelos utilitários no PATH padrão antes das alterações exigidas pelo Unix95 (sim, Unix95, vinte anos atrás e contando). Pode haver um conjunto de ferramentas Unix95 ou POSIX.1-2001, se você tiver sorte, em um diretório que não esteja no PATH padrão (por exemplo /usr/xpg4/bin
), mas não há garantia de que elas existem.
No entanto, é mais provável que o básico do Perl esteja presente em uma instalação Unix selecionada arbitrariamente do que o Bash. (Por "princípios básicos do Perl", quero dizer, /usr/bin/perl
existe e é uma versão do Perl 5, possivelmente bastante antiga, e se você tiver sorte, o conjunto de módulos fornecidos com essa versão do interpretador também estará disponível.)
Assim sendo:
Se você está escrevendo algo que tem que funcionar em qualquer lugar que pretenda ser Unix (como um script "configure"), você precisa usá #! /bin/sh
-lo e não usar nenhuma extensão. Atualmente, eu escreveria um shell compatível com POSIX.1-2001 nessa circunstância, mas estaria preparado para corrigir os POSIXismos se alguém pedisse suporte para ferro enferrujado.
Mas se você não estiver escrevendo algo que funcione em qualquer lugar, no momento em que for tentado a usar qualquer bashismo, pare e reescreva tudo em uma linguagem de script melhor. Seu futuro eu agradecerá.
(Então, quando é apropriado usar extensões Bash? Na primeira ordem: nunca. Na segunda ordem: apenas para estender o ambiente interativo da Bash - por exemplo, para fornecer guias inteligentes e solicitações sofisticadas).
#!/bin/sh
e não use nada além do que o shell original forneceu.