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