Z:
FILES = $(shell ls)
z takim wcięciem all, jest to polecenie kompilacji. Więc to się rozwija $(shell ls), a następnie próbuje uruchomić polecenie FILES ....
Jeśli FILESma to być makezmienna, zmienne te należy przypisać poza częścią receptury, np .:
FILES = $(shell ls)
all:
echo $(FILES)
Oczywiście oznacza to, że FILESzostanie ustawiony na „wyjście z ls” przed uruchomieniem któregokolwiek z poleceń tworzących pliki .tgz. (Chociaż, jak zauważa Kaz, zmienna jest ponownie rozszerzana za każdym razem, więc ostatecznie będzie zawierać pliki .tgz; niektóre warianty make muszą FILES := ...tego unikać, ze względu na wydajność i / lub poprawność. 1 )
Jeśli FILESma to być zmienna powłoki, możesz ją ustawić, ale musisz to zrobić w shell-ese, bez spacji i zacytować:
all:
FILES="$(shell ls)"
Jednak każda linia jest prowadzona przez oddzielną powłokę, więc ta zmienna nie przetrwa do następnej linii, więc musisz ją natychmiast użyć:
FILES="$(shell ls)"; echo $$FILES
To wszystko jest trochę głupie, ponieważ powłoka będzie się rozszerzać *(i inne wyrażenia glob powłoki) w pierwszej kolejności, więc możesz po prostu:
echo *
jako polecenie powłoki.
Na koniec, jako ogólna zasada (nie do końca dotyczy tego przykładu): jak zauważa esperanto w komentarzach, użycie danych wyjściowych z lsnie jest całkowicie wiarygodne (niektóre szczegóły zależą od nazw plików, a czasem nawet wersji ls; niektóre wersje lspróby oczyszczenia wyjścia w niektórych przypadkach). Tak więc, jak l0b0 i ideliczna uwaga, jeśli używasz GNU, możesz użyć $(wildcard)i $(subst ...)osiągnąć wszystko w makesobie (unikając problemów z "dziwnymi znakami w nazwie pliku"). (W shskryptach, w tym w plikach makefile z recepturami, inną metodą jest find ... -print0 | xargs -0unikanie potknięcia się o spacje, znaki nowej linii, znaki sterujące itp.)
1 GNU Dokonywanie dokumentacji dalej zauważa, że POSIX wprowadza dodatkowe ::=przypisanie w 2012 roku . Nie znalazłem szybkiego odnośnika do dokumentu POSIX dla tego, ani nie wiem od ręki, które makewarianty obsługują ::=przypisywanie, chociaż GNU robi to dzisiaj, z tym samym znaczeniem, co :=, tj. Wykonuje przypisanie teraz z rozszerzeniem.
Zauważ, że VAR := $(shell command args...)można to również zapisać VAR != command args...w kilku makewariantach, w tym we wszystkich nowoczesnych wariantach GNU i BSD, o ile wiem. Te inne warianty nie mają, $(shell)więc użycie VAR != command args...jest lepsze zarówno pod względem krótszego, jak i pracy w większej liczbie wariantów.
lszsedi wytnij), a następnie użyć wyników w rsync i innych poleceniach. Czy muszę w kółko powtarzać długie polecenie? Czy nie mogę przechowywać wyników w wewnętrznej zmiennej Make?