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

13

Alguém pode colocar essas ferramentas em ordem de portabilidade? Qual destes é certo para ser encontrado mesmo nos sistemas mínimos * nix? Alguma delas tem 100% de certeza de estar presente? Meu palpite é que o pedido é o seguinte:

  1. awk
  2. sed
  3. sh
  4. perl

Embora eu imagine que existam sistemas que não possuem um shell padrão, o shell some estará presente como padrão, será que sempre estará em /bin/sh ? Presumivelmente, não se não for uma casca do tipo bourne. Ambos awk e sed têm páginas que os explicam sobre a especificação POSIX, então presumivelmente estarão sempre presentes. É assim mesmo? Posso ter certeza que ambos serão instalados em qualquer * nix? Incluindo sistemas embarcados?

    
por terdon 04.04.2014 / 17:23

2 respostas

13

Which is the most portable of sed, awk, perl and sh?

sed , sh e awk são portáveis sendo especificados por POSIX, perl não é como não sendo suportado por um padrão.

Can someone put these tools in order of portability?

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

Which of these is certain to be found on even the most minimal *nix systems?

Os três POSIX junto com muitos outros utilitários são obrigatórios para um sistema operacional ser POSIX. OSes que faltam a alguns deles devido à minimização, ou que fornecem implementações incompletas / não conformes existem.

Na verdade, a maioria (se não todos) os sistemas operacionais baseados em Unix de código aberto e livre provavelmente não passariam no processo de conformidade caso eles tentassem, e nunca tentariam de qualquer maneira.

Is any of them 100% sure to be present?

Eu ficaria surpreso em encontrar um * nix como o SO que não possui um shell baseado na sintaxe Bourne, mas tudo é possível, especialmente com sistemas embarcados.

My guess is that the order is the following: Some shell will be present as the default, will that always be at /bin/sh?

É provável que

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

    
por 06.04.2014 / 15:26
11

Adote uma sugestão no Autotools: mantenha o menor denominador comum de shell Bourne e POSIX - possivelmente aumentado por sed - se você tiver que escrever algo que deve funcionar em todos os lugares . Pode haver sistemas em que algo quebre, mas você pode contornar esses problemas reescrevendo.

Por exemplo, alguns sistemas antigos têm problemas com erros de expansão em test , a.k.a. [ :

 if [ $foo = bar ] ; then...

a prática do Autoconf é reescrevê-lo entre aspas duplas com um prefixo de caractere único, 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 para test(1) e, como [ é um alias para test , poderia interpretar erroneamente a expressão. A solução é configurar uma situação em que o argumento desconhecido para [ sempre comece com x , o que significa que não pode ter um significado especial para [ .

(o Autoconf também recomenda usar test em vez de [ , mas esse conselho surge como uma reação a possíveis conflitos com M4 , que também usa [ em sua sintaxe.

o awk é POSIX , portanto, teoricamente, ele está disponível em todos os lugares. É até mesmo no Busybox , então você terá uma implementação de awk mesmo em alguns sistemas Linux embarcados muito restritivos. Ainda assim, eu ficaria menos surpreso em encontrar um sistema sem awk do que sed . Eu suponho que se reduz à complexidade: ferramentas mais simples são mais propensas a sobreviver à triagem agressiva.

Perl não faz parte de nenhum padrão generalizado, POSIX ou outro, então você simplesmente não pode contar com isso se você não souber nada antecipadamente sobre o ambiente de destino. Perl não é instalado por padrão em:

  • Cygwin
  • FreeBSD e NetBSD
  • instalações "mínimas" para alguns Linuxes, incluindo o Slackware
  • muitos Linuxes incorporados que dependem principalmente do Busybox para sua área de usuário

O manual do Autoconf tem um capítulo sobre o shell portátil programação que deve ser útil para você. A última seção aborda ferramentas como sed , awk e muitas outras.

    
por 04.04.2014 / 17:35