teste POSIX e -a

8

Eu verifiquei um script meu com checkbashisms e recebi os seguintes avisos:

possible bashism in check_ssl_cert line 821 (test -a/-o):
if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then

Na seção 4.62.4 das especificações POSIX eu acho

primary -a primary Performs a binary and of the results of primary and primary. The -a operator has precedence over the -o operator.

Por que -a e -o são considerados não portáteis?

    
por Matteo 07.12.2012 / 08:01

2 respostas

10

Não é tanto que não seja portável, mas não exista nenhuma implementação [ onde seja confiável quando passar por mais de 4 argumentos.

Mesmo no bash:

$ ALTNAMES='='  bash -c '[ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ]'
bash: line 0: [: too many arguments

A seção relacionada afirma:

>4 arguments:

The results are unspecified.

[OB XSI] [Option Start] On XSI-conformant systems, combinations of primaries and operators shall be evaluated using the precedence and associativity rules described previously. In addition, the string comparison binary primaries '=' and "!=" shall have a higher precedence than any unary primary. [Option End]

-a e -o devem ser banidos. O caminho certo é usar os operadores && e || shell :

if [ -n "$foo" ] && [ -n "$bar" ]; then

Eu até acho mais legível.

    
por 07.12.2012 / 08:36
2

Porque eles são uma extensão XSI, que pode ou não ser implementada. Consulte: link

    
por 20.12.2012 / 03:01