Pegue uma dica do Autotools: atenha-se ao menor denominador comum do shell Bourne e POSIX - possivelmente aumentado por sed- se você precisar escrever algo que deve funcionar em qualquer lugar . Pode haver sistemas onde algo ocorra, mas você pode solucionar esses problemas reescrevendo.
Por exemplo, alguns sistemas antigos têm problemas com erros de expansão em test , também conhecidos como [:
if [ $foo = bar ] ; then...
assim a prática do Autoconf é reescrevê-lo entre aspas duplas com um único prefixo de caractere, assim:
if [ x"$foo" = "xbar" ] ; then...
Você também pode usar "x$foo"aqui. Isso protege contra a possibilidade de que $foopossa ser uma opção válida test(1)e, como [é um alias paratest , poderia interpretar mal a expressão. A solução é configurar uma situação em que o argumento desconhecido [sempre comece x, o que significa que ele não pode ter um significado especial [.
(O Autoconf também recomenda o uso em testvez de [, mas esse conselho ocorre como uma reação a possíveis conflitos com o M4 , que também usa [em sua sintaxe.)
awk é POSIX , portanto, teoricamente, está disponível em qualquer lugar. É mesmo no Busybox , então você terá umawk implementação mesmo em alguns sistemas Linux embarcados muito restritivos. Ainda assim, eu ficaria menos surpreso ao se deparar com um sistema sem awkque sed. Suponho que tudo se resume à complexidade: ferramentas mais simples têm mais probabilidade de sobreviver à triagem agressiva.
O Perl não faz parte de nenhum padrão generalizado, POSIX ou outro, então você simplesmente não pode contar com isso se não souber nada de antemão sobre o ambiente de destino. O Perl não está instalado por padrão em:
- Cygwin
- FreeBSD e NetBSD
- instalações "mínimas" para alguns Linux, incluindo Slackware
- muitos Linux embarcados que dependem principalmente do Busybox para sua terra de usuário
O manual do Autoconf possui um capítulo sobre programação portátil de shell que deve ser útil para você. As ferramentas de última seção aborda como sed, awk, e muitos outros.