Suppongo che tu abbia visto $(CC)
in un Makefile dove funge da espansione della variabile CC
, che normalmente contiene il nome del compilatore C. Il $(...)
la sintassi per le espansioni delle variabili nei Makefile viene utilizzata ogni volta che una variabile con un nome composto da più caratteri viene espansa, come $CC
altrimenti si espanderebbe al valore della variabile C
seguito da un letterale C
($CC
sarebbe in effetti lo stesso di $(C)C
in un Makefile).
Nella shell però, a causa della diversa sintassi, $(CC)
è una sostituzione di comando che verrebbe sostituita dall'output dell'esecuzione del comando CC
. Se non c'è tale comando sul tuo sistema, vedresti un errore "comando non trovato".
È anche possibile che tu abbia sbagliato $(CC)
per ${CC}
che, nella shell, equivale a $CC
nella maggior parte delle circostanze. Le parentesi graffe sono necessarie solo se l'espansione della variabile viene seguita immediatamente da un'altra stringa che verrebbe altrimenti interpretata come parte del nome della variabile. Un esempio della differenza può essere visto in "$CC_hello"
(espande la variabile chiamata CC_hello
) e "${CC}_hello"
(espande la variabile CC
e aggiunge la stringa _hello
al suo valore). In tutte le altre circostanze, ${CC}
equivale a $CC
. Tieni presente che l'uso delle parentesi graffe non è citando l'espansione, cioè ${CC}
non lo stesso di "$CC"
.
Se hai una shell o una variabile d'ambiente che contiene il nome del compilatore che stai usando per compilare il codice C, e vuoi usare quella variabile sulla riga di comando, allora usa "$CC"
, o semplicemente $CC
se il valore della variabile non contiene spazi o caratteri di shell globbing.
$CC -o hello.elf hello.c
I due non sono equivalenti. In una riga che contiene $(foo)
, il $(foo)
è sostituito con l'output del comando foo
. Ad esempio:
$ echo "hello $(echo world)"
hello world
In una riga che contiene $foo
, il $foo
viene sostituito con il valore della variabile denominata foo
. Ad esempio:
$ foo=world
$ echo "hello $foo"
hello world