Předpokládám, že jste viděli $(CC) v Makefile, kde slouží jako rozšíření proměnné CC , který normálně nese název kompilátoru C. $(...) syntaxe pro rozšíření proměnných v Makefiles se používá vždy, když je rozbalena proměnná s víceznakovým názvem, jako $CC by jinak expandoval na hodnotu proměnné C následovaný doslovným C ($CC by ve skutečnosti bylo stejné jako $(C)C v souboru Makefile).
V shellu však kvůli jiné syntaxi $(CC) je náhrada příkazu, která by byla nahrazena výstupem spuštění příkazu CC . Pokud ve vašem systému žádný takový příkaz není, zobrazí se chyba „příkaz nenalezen“.
Je také možné, že jste si spletli $(CC) pro ${CC} což je v shellu ekvivalentní $CC za většiny okolností. Složené závorky jsou potřeba pouze v případě, že je expanze proměnné sledována okamžitě nějakým jiným řetězcem, který by jinak byl interpretován jako součást názvu proměnné. Příklad rozdílu lze vidět v "$CC_hello" (rozšíří proměnnou nazvanou CC_hello ) a "${CC}_hello" (rozšíří proměnnou CC a připojí řetězec _hello na jeho hodnotu). Za všech ostatních okolností ${CC} je ekvivalentní $CC . Upozorňujeme, že použití složených závorek není citovat rozšíření, tj. ${CC} není stejně jako "$CC" .
Pokud máte shell nebo proměnnou prostředí obsahující název kompilátoru, který používáte pro kompilaci kódu C, a chcete tuto proměnnou použít na příkazovém řádku, použijte "$CC" , nebo jen $CC pokud hodnota proměnné neobsahuje mezery nebo globovací znaky.
$CC -o hello.elf hello.c
Ti dva nejsou ekvivalentní. V řádku, který obsahuje $(foo) , $(foo) je nahrazeno výstupem příkazu foo . Například:
$ echo "hello $(echo world)"
hello world
V řádku, který obsahuje $foo , $foo je nahrazena hodnotou proměnné s názvem foo . Například:
$ foo=world
$ echo "hello $foo"
hello world