İle:
FILES = $(shell ls)
Altında all
böyle girintili , bu bir inşa komutu. Böylece bu genişler $(shell ls)
, ardından komutu çalıştırmayı dener FILES ...
.
Eğer FILES
bir olması gerekiyordu make
değişken, bu değişkenler tarifi kısmı, örneğin dışında atanması gerekir:
FILES = $(shell ls)
all:
echo $(FILES)
Elbette bu, .tgz dosyalarını oluşturan komutlardan herhangi birini çalıştırmadan önceFILES
"çıkış kaynağı ls
" olarak ayarlanacağı anlamına gelir . ( Kaz değişkenin her seferinde yeniden genişletildiğini belirtse de, sonunda .tgz dosyalarını içerecektir; bazı üretici varyantlarının verimlilik ve / veya doğruluk için bundan kaçınması gerekir . 1 )FILES := ...
Eğer FILES
bir kabuk değişkeni olması gerekiyordu, bunu ayarlayabilirsiniz ancak boşluk olmadan, kabuk-ese bunu yapmak gerekmez ve alıntı:
all:
FILES="$(shell ls)"
Bununla birlikte, her satır ayrı bir kabuk tarafından çalıştırılır, bu nedenle bu değişken bir sonraki satıra kadar hayatta kalmayacaktır, bu nedenle hemen kullanmanız gerekir:
FILES="$(shell ls)"; echo $$FILES
*
Kabuk sizin için (ve diğer kabuk glob ifadelerini) ilk etapta genişleyeceğinden, bu biraz aptalca , böylece şunları yapabilirsiniz:
echo *
Kabuk komutunuz olarak.
Son olarak, genel bir kural olarak (bu örnek için gerçekten geçerli değildir): esperanto'nun yorumlarda belirttiği gibi , çıkışını kullanmak ls
tamamen güvenilir değildir (bazı ayrıntılar dosya adlarına ve hatta bazen sürümüne bağlıdır ls
; ls
çıktıyı temizleme girişiminin bazı sürümleri bazı durumlarda). Bu nedenle, l0b0 ve idelic not olarak, GNU make'i kullanıyorsanız, kendi içindeki her şeyi başarabilir $(wildcard)
ve $(subst ...)
başarabilirsiniz make
("dosya adındaki garip karakterler" sorunlarından kaçınarak). ( sh
Makefile dosyalarının tarif bölümü de dahil olmak üzere komut dosyalarında, find ... -print0 | xargs -0
boşluklar, satırsonları, kontrol karakterleri vb. Üzerinde gezinmekten kaçınmak için başka bir yöntem kullanılır .)
1 GNU Make belgeleri, POSIX'in ::=
2012'de ek atamalar yaptığını belirtmektedir . Bunun için bir POSIX belgesine hızlı bir referans bağlantısı bulamadım ve hangi make
varyantların ::=
atamayı desteklediğini de bilmiyorum , ancak bugün GNU yapmakla aynı anlama geliyor :=
, yani atamayı şimdi genişletme ile yapıyor.
Bildiğim kadarıyla tüm modern GNU ve BSD varyantları da dahil olmak üzere çeşitli varyantlarda VAR := $(shell command args...)
yazılabileceğini unutmayın . Bu diğer varyantlar yok bu yüzden kullanarak hem daha kısa olmak üstündür ve daha varyantları çalışan.VAR != command args...
make
$(shell)
VAR != command args...
ls
ilesed
ve kes) ve sonra sonuçları rsync ve diğer komutlarda kullanmak istiyorum. Uzun komutu defalarca tekrar etmem gerekiyor mu? Sonuçları dahili bir Make değişkeninde saklayamaz mıyım?