colchete duplo em 'case' em 'configure.ac' i [[3456]] 86

4

Estou tentando entender o seguinte trecho de código.

host_cpu='i386'

case "$host_cpu" in
   i[[3456]]86)
       echo "host_cpu=i386"
   ;;
   x86_64)
       echo "host_cpu=x86_64"
   ;;
   *)
       echo "AC_MSG_ERROR([unsupported CPU type]) "
   ;;
esac

Eu adicionei a variável host_cpu='i386' eu mesmo para testar o código e ele mudou para o terceiro caso de echo "AC_MSG_ERROR([unsupported CPU type]) " .

Se eu alterar o colchete duplo em i[[3456]]86) para um único colchete como em i[3456]86) , ele alterna para a primeira opção, gerando i386 . Isso parece correto para mim.

Entendo que [ e [[ são as opções de teste. A condição de teste não parece se aplicar aqui, pois os casos de comutação estão esperando que um caractere seja gerado. Então, suponho que para o bash pegá-lo como uma condição de teste, ele precisa ser separado por um espaço como em [ a < b ] ou [[ a << b ]] . Como não há espaços nessa declaração de caso, ela será tratada como uma expressão regular. Está correto?

Então, minha pergunta é por que o colchete duplo foi usado aqui pelo codinome? Não funcionou quando tentei executar o código, então qual era a intenção deles?

Nota: O código foi retirado de um configure.ac no código fonte do GRUB.

Além disso, a linha $ host_cpu e host_cpu = i386 parece desnecessária, você pode explicar por que o escritor teria feito isso:

AC_CANONICAL_HOST

case "$host_cpu" in
    i[[3456]]86) host_cpu=i386 ;;
    x86_64) host_cpu=x86_64 ;;
    *) AC_MSG_ERROR([unsupported CPU type]) ;;
esac

AC_SUBST(host_cpu)
AC_SUBST(host_vendor)

Estou pensando em usar AC_SUBST ($ host_cpu). Por que você não faria assim?

    
por supmethods 04.10.2018 / 03:30

1 resposta

8

Se for um arquivo configure.ac , então não é um script de shell puro, mas é um script Autoconf usando M4, onde [] são caracteres de aspas. :

To fully understand where proper quotation is important, you first need to know what the special characters are in Autoconf: ‘#’ introduces a comment inside which no macro expansion is performed, ‘,’ separates arguments, ‘[’ and ‘]’ are the quotes themselves, ‘(’ and ‘)’ (which M4 tries to match by pairs), and finally ‘$’ inside a macro definition.

Each time there can be a macro expansion, there is a quotation expansion, i.e., one level of quotes is stripped:

 int tab[10];
 ⇒int tab10;
 [int tab[10];]
 ⇒int tab[10];

Esse [[3456]] deve ser expandido pelo autoconf para [3456] , que seria a saída correta para uso como um script de shell.

    
por 04.10.2018 / 04:16