podwójny nawias kwadratowy w „case” w „configure.ac” i [[3456]] 86


4

Próbuję zrozumieć następujący fragment kodu.

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

Sam dodałem zmienną, host_cpu='i386'aby przetestować kod, i zmieniłem ją na trzeci przypadek echo "AC_MSG_ERROR([unsupported CPU type]) ".

Jeśli zmienię podwójny nawias klamrowy i[[3456]]86)na pojedynczy nawias klamrowy jak w i[3456]86), przełącza się on na pierwszą opcję, dając i386. Wydaje mi się to poprawne.

Rozumiem to [i [[są to opcje testowe. Wydaje się, że warunek testowy nie ma tutaj zastosowania, ponieważ przypadki przełączników oczekują, że zostanie wyświetlony znak. Zakładam więc, że bash odbierze go jako warunek testowy, musi być oddzielony spacją jak w [ a < b ]lub [[ a << b ]]. Ponieważ w tej instrukcji przypadku nie ma spacji, będzie traktowane jako wyrażenie regularne. Czy to jest poprawne?

Moje pytanie brzmi więc, dlaczego autor kodu użył podwójnego nawiasu kwadratowego? Nie działało, gdy próbowałem uruchomić kod, więc jaki był ich zamiar.

Uwaga: kod pochodzi z configure.ackodu źródłowego GRUB.

Także linie $ host_cpu i host_cpu = i386 wydają się niepotrzebne, czy możesz wyjaśnić, dlaczego pisarz zrobiłby to:

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)

Myślę o użyciu AC_SUBST ($ host_cpu). Dlaczego nie zrobiłbyś tego w ten sposób?


2
Wygląda jak błąd. Sugeruję przesłanie żądania ściągnięcia. I nie, to nie jest wyrażenie regularne; to dopasowywanie wzorców, które działa tak samo jak globusy plików.
Wildcard

Odpowiedzi:


8

Jeśli pochodzi z configure.acpliku, to nie jest to czysty skrypt powłoki, ale skrypt Autoconf używający M4, w którym []występują znaki cudzysłowu. :

Aby w pełni zrozumieć, gdzie ważna jest poprawna oferta, musisz najpierw dowiedzieć się, jakie znaki specjalne znajdują się w programie Autoconf: „ #wprowadza komentarz, w którym nie jest wykonywana żadna interpretacja makr”, ,„rozdziela argumenty [” i „ ]” to same cytaty, „ (” i „ )” (które M4 próbuje dopasować parami) i wreszcie „ $” w definicji makra.

Za każdym razem, gdy może wystąpić rozwinięcie makra, następuje rozwinięcie cytatu, tzn. Jeden poziom cytatów jest usuwany:

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

Że [[3456]]powinien zostać rozszerzony przez autoconf do [3456], co byłoby poprawne wyjście do wykorzystania jako skrypt powłoki.


1
Rzeczywiście - jak można to sprawdzić, dodając minimum AC_INIT([foo])do góry fragmentu autoconf snippet
kodu,

Ok, dzięki. Czytałem o m4 i używali w tych artykułach znaków cudzysłowu `i '. Musieli więc zmienić cytaty w pliku config.ac, aby traktować [i] jako cytaty.
supmethods

Podany link używa [i] jako cudzysłowu. Czy to zależy od używanej wersji M4?
supmethods

@supmethods możesz zmienić znaki cytowania w M4 , i wydaje [ ]się, że są ustawione jako znaki cytowania w skryptach autoconf. Domyślne znaki cytowania w M4 to `' , jak widzieliście.
muru

Zaktualizowałem post i chciałbym poznać główny cel tej sprawy. AC_CANONICAL_HOST oblicza host_cpu, host_vendor i host_os. Czy to nie oznacza, że ​​nie potrzebujesz przypisywania zmiennych (jak w host_cpu = i386 i host_cpu = x86_64) i że możesz po prostu zrobić „jeśli $ host_cpu jest fałszem, to AC_MSG_ERROR ([nieobsługiwany typ procesora])” ? host_cpu powinien być już ustawiony z AC_CANONICAL_HOST, więc zmienna powłoki może być ustawiona od razu (AC_SUBST (host_cpu) bez przypisania).
supmethods
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.