Alguém pode colocar essas ferramentas em ordem de portabilidade? Qual deles certamente será encontrado nos sistemas * nix mais mínimos? Algum deles tem 100% de certeza de estar presente? Meu palpite é que a ordem é a seguinte:
- awk
- sed
- sh
- perl
Enquanto eu imagino que existam sistemas que não sejam padrão para um shell bourne, algum shell estará presente como padrão, sempre será esse /bin/sh
? Presumivelmente não, se não for uma concha do tipo bourne. Ambos awk
e sed
têm páginas explicando-los na especificação POSIX então, presumivelmente, eles vão estar sempre presente. É assim mesmo? Posso ter certeza de que ambos serão instalados em qualquer * nix? Incluindo sistemas embarcados?
posix
portability
terdon
fonte
fonte
sh
, por exemplo, e meu NAS baseado no busybox também possui perl.awk
sed
Respostas:
sed
,sh
eawk
são portáteis, sendo especificados pelo POSIX,perl
não são suportados por um padrão.Se você seguir o código compatível, não haverá ordem de portabilidade para os três comandos POSIX.
Os três POSIX, juntamente com muitos outros utilitários, são obrigatórios para que um sistema operacional seja POSIX. Existem sistemas operacionais que faltam alguns deles devido à minimização ou ao fornecimento de implementações incompletas / não conformes.
Na verdade, a maioria (se não todos) os sistemas operacionais Unix, de código aberto e gratuito, provavelmente não passariam no processo de conformidade caso tentassem, e nunca tentam de qualquer maneira.
Eu ficaria surpreso ao encontrar um * nix como o SO sem um shell baseado em sintaxe Bourne, mas tudo é possível, especialmente em sistemas embarcados.
/bin/sh
é provável que seja um shell da família de sintaxe Bourne, mas não é garantido que seja compatível com POSIX, mesmo em sistemas compatíveis com POSIX. Por exemplo, ele está/usr/xpg4/bin/sh
no Solaris 10 e mais antigo, enquanto/bin/sh
é o shell Bourne original herdado que não é POSIX.fonte
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[
:assim a prática do Autoconf é reescrevê-lo entre aspas duplas com um único prefixo de caractere, assim:
Você também pode usar
"x$foo"
aqui. Isso protege contra a possibilidade de que$foo
possa ser uma opção válidatest(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 comecex
, 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á um
awk
implementação mesmo em alguns sistemas Linux embarcados muito restritivos. Ainda assim, eu ficaria menos surpreso ao se deparar com um sistema semawk
quesed
. 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:
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.fonte
sh
esed
é o mais portátil. OK, e os outros? E ésh
realmente tão portátil? E se o shell padrão for um derivado do shell C? Esse sistema ainda terá um link simbólico/bin/sh
?sed
eawk
são fornecidos pelo busybox, por que você ficaria mais surpreso ao descobrir que estásed
ausente? Você tem alguma idéia se as alternativas do busybox também fornecem sed e awk?sed
faz menos, então seu binário será menor; portanto, há menos motivos para removê-lo do queawk
, o que é bastante complexo. (20 kiB vs 48 kiB no meu sistema.) Re: Alternativas ao Busybox , não conheço nenhuma outra alternativa de compra única.sh
- estranho que terdon esteja acimaawk
esed
acima desta o_O?), Embora isso seja apenas coincidência com os propósitos do Autotool, já que alguns ambientes, particularmente pequenos, pode não ser para construção, ponto final./bin/sh
, então as coisas são diferentes, mas eu não sabia que todos teriam um. Desculpe por não aceitar isso, a propósito, fiquei dividida entre as respostas sua e da jlliagre, que responderam à minha pergunta. Eu escolhi o dele porque ele abordava mais diretamente e porque ele tem menos reputação :).