Como posso testar a conformidade POSIX de scripts de shell?

65

Considerando que o POSIX é a coisa mais próxima de um padrão comum entre todos os unices, estou interessado em saber se existe um shell que o suporte exclusivamente. Enquanto a maioria dos shells modernos fornecem suporte para POSIX (e executam scripts compatíveis com POSIX sem nenhum problema), eles não fazem um bom trabalho ao apontar recursos não compatíveis.

Existe algum shell que implemente apenas POSIX e POSIX, de tal forma que ele jogue um erro para qualquer recurso não compatível?

EDIT Quero esclarecer que não estou pedindo dicas gerais para escrever scripts de shell portáteis. A questão relacionada mencionada nos comentários já cobriu isso. Pensei nessa questão quando descobri que bash tem uma opção --posix , mas apenas para descobrir que ela afeta apenas alguns comportamentos de inicialização que não são exatamente o que estou procurando.

    
por rahmu 21.09.2012 / 14:35

3 respostas

33

Infelizmente, 'portátil' é geralmente um requisito mais strong do que 'compatível com POSIX' para scripts de shell. Ou seja, escrever algo que é executado em qualquer shell POSIX não é muito difícil, mas fazê-lo funcionar em qualquer shell do mundo real é mais difícil.

Você pode começar instalando todos os shell do seu gerenciador de pacotes, em particular posh do debian soa como o que você quer (Shell comum compatível com Policy). A política do Debian é POSIX com algumas exceções ( echo -n especificado, local ...).

Além disso, o teste tem que cobrir alguns shells (/ bin / sh especialmente) em uma variedade de plataformas. Eu testo no Solaris (/ bin / sh e xpg4 / sh) e no BSD. O AIX e o HP-UX são muito compatíveis e não causam problemas. bash é um pequeno mundo próprio.

Eu recomendaria o Guia Autoconf para o shell portátil , que é absolutamente brilhante e economiza muito tempo. Grandes pedaços são obsoletos, mas tudo bem; apenas pule TruUnix e Ultrix e assim por diante se você não se importa!

    
por 21.09.2012 / 14:46
22

Você pode usar o ShellCheck (GitHub) como um linter para seus scripts de shell. Há também uma versão on-line .

Para detectar problemas de compatibilidade POSIX (por exemplo, SC2039 ), o shebang line do seu script de shell deve ser #!/bin/sh . Você também pode passar --shell=sh para shellcheck .

Exemplo ( test.sh ):

#!/bin/sh
if [[ $HOSTNAME == test ]]; then
    echo fail &> foo
fi

Resultado ( shellcheck test.sh ):

In test.sh line 2:
if [[ $HOSTNAME == test ]]; then
   ^-- SC2039: In POSIX sh, [[ ]] is undefined.
      ^-- SC2039: In POSIX sh, HOSTNAME is undefined.    

In test.sh line 3:
    echo fail &> foo
              ^-- SC2039: In POSIX sh, &> is undefined.
    
por 20.04.2016 / 11:44
12

O Bash será executado no modo compatível com POSIX se a variável de ambiente POSIXLY_CORRECT estiver definida. A partir do manpage:

   POSIXLY_CORRECT
          If  this  variable  is  in the environment when bash starts, the
          shell enters posix mode before reading the startup files, as  if
          the  --posix  invocation option had been supplied.  If it is set
          while the shell is running, bash enables posix mode, as  if  the
          command set -o posix had been executed.

Muitos outros utilitários GNU também honram POSIXLY_CORRECT , então se você estiver em um sistema com ferramentas predominantemente GNU (por exemplo, a maioria dos sistemas Linux), este é um bom começo se seu objetivo for a conformidade POSIX.

    
por 22.09.2012 / 00:06