Ebből azt kellene látni, hogy az 'UN1' egy 'programot' tárol, amit a ${UN1} használatakor futatt, az 'UN2' viszont rögtön a program kimenetét tárolja.
Az UN1 deklaráláskor kiértékelődik (a shell hívás miatt). Innentől már az uname által visszaadott értéket tárolja, tehát nem fut le többször.
Egy egyszerű teszt:
VAL= $(shell date)
all:
@date
@sleep 2
@echo ${VAL}
@sleep 2
@echo ${VAL}
Mindhárom dátum ugyanaz lesz, nem lesznek 2 másodperces eltérések (azaz 2 másodperc múlva nem fut le még egyszer) - max. ha épp nagyon olyankor futtatod, hogy a VAL-féle date után az all első date-je között másodperc-váltás történik :D