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 $foo
possa 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 test
vez 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 awk
que 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.