Uważaj na takie przepisy
target:
MY_ID=$(GENERATE_ID);
echo $MY_ID;
Robi dwie rzeczy źle. Pierwszy wiersz w przepisie jest wykonywany w osobnej instancji powłoki od drugiego wiersza. W międzyczasie zmienna została utracona. Drugą wadą jest to, że $
nie uciekł.
target:
MY_ID=$(GENERATE_ID); \
echo $$MY_ID;
Oba problemy zostały naprawione i zmienna jest użyteczna. Odwrotny ukośnik łączy oba wiersze, aby działały w jednej powłoce, dlatego działa ustawienie zmiennej i odczytywanie zmiennych po słowie.
Zdaję sobie sprawę, że w pierwotnym poście powiedziano, jak uzyskać wyniki polecenia powłoki do zmiennej MAKE, a ta odpowiedź pokazuje, jak przenieść ją do zmiennej powłoki. Ale inni czytelnicy mogą skorzystać.
Ostatnia poprawka, jeśli konsument spodziewa się ustawienia „zmiennej środowiskowej”, musisz ją wyeksportować.
my_shell_script
echo $MY_ID
potrzebuje tego w pliku makefile
target:
export MY_ID=$(GENERATE_ID); \
./my_shell_script;
Mam nadzieję, że komuś pomoże. Ogólnie rzecz biorąc, należy unikać wykonywania prawdziwej pracy poza przepisami, ponieważ jeśli ktoś użyje makefile z opcją „--dry-run”, aby ZOBACZYĆ tylko, co zrobi, nie spowoduje to żadnych niepożądanych efektów ubocznych. Każde $(shell)
połączenie jest oceniane podczas kompilacji, a niektóre prawdziwe prace mogą zostać przypadkowo wykonane. Lepiej pozostawić prawdziwą pracę, taką jak generowanie identyfikatorów, w przepisach, jeśli to możliwe.