Qual é o mais portátil de sed, awk, perl e sh?

15

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:

  1. awk
  2. sed
  3. sh
  4. 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 awke sedtê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?

terdon
fonte
sistemas embarcados geralmente sacrificam a portabilidade para permanecerem mínimos. Muitos não são compatíveis com POSIX.
Jordanm #
@jordanm isso significa que eles podem não ter nada disso? Estou assumindo um sistema que fornece pelo menos uma interface shell mínima. Eu sei que o busybox fornece e sh, por exemplo, e meu NAS baseado no busybox também possui perl. awksed
terdon
1
Você pode tê-los, mas o que eles fazem variará entre os sistemas, portanto a questão não faz muito sentido, como afirmado.
Stéphane Chazelas 04/04
@StephaneChazelas ah, você poderia me ajudar a reduzi-lo então? Não é possível classificá-las em termos da probabilidade de serem encontradas no sistema X? Minha experiência é estritamente Linux e alguns sistemas NAS incorporados. Eu sei que você nunca terá um GNU / Linux sem todos os quatro, mas você não pode me dar uma idéia de qual deles é mais seguro assumir estar presente?
terdon

Respostas:

15

Qual é o mais portátil de sed, awk, perl e sh?

sed, she awksão portáteis, sendo especificados pelo POSIX, perlnão são suportados por um padrão.

Alguém pode colocar essas ferramentas em ordem de portabilidade?

Se você seguir o código compatível, não haverá ordem de portabilidade para os três comandos POSIX.

Qual deles certamente será encontrado até nos sistemas * nix mais mínimos?

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.

Algum deles tem 100% de certeza de estar presente?

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.

Meu palpite é que a ordem é a seguinte: Alguns shell estarão presentes como padrão, sempre estarão em / bin / sh?

/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/shno Solaris 10 e mais antigo, enquanto /bin/shé o shell Bourne original herdado que não é POSIX.

jlliagre
fonte
12

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.

Warren Young
fonte
Obrigado, mas estou me perguntando sobre a ordem de portabilidade deles. Se eu entendi direito, você está sugerindo isso she sedé o mais portátil. OK, e os outros? E é shrealmente 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?
terdon
Obrigado pela edição, é isso mesmo, ambos sede awksão fornecidos pelo busybox, por que você ficaria mais surpreso ao descobrir que está sedausente? Você tem alguma idéia se as alternativas do busybox também fornecem sed e awk?
terdon
Re: POSIX vs Bourne shell , reescreveu o conselho para manter o LCD dos dois. Re: test citando , lembrei mal o motivo, mas encontrei o capítulo no manual do Autoconf onde o motivo é abordado e editei a resposta de acordo. Re: sed vs awk e Busybox , expliquei que: maior complexidade e triagem. sedfaz menos, então seu binário será menor; portanto, há menos motivos para removê-lo do que awk, 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.
Warren Young
+1 Porque eu concordo com sua premissa geral aqui (que o menor denominador comum será algum tipo de sh- estranho que terdon esteja acima awke sedacima 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.
Goldilocks
1
@ WarrenYoung é o tipo de coisa que eu estava pensando. Não tenho idéia se todos os sistemas * nix realmente teriam um shell bourne instalado por padrão. Se todos eles têm um /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 :).
terdon