Saya berasumsi bahwa Anda telah melihat $(CC) di Makefile yang berfungsi sebagai perluasan variabel CC , yang biasanya menyimpan nama kompiler C. $(...) sintaks untuk perluasan variabel di Makefiles digunakan setiap kali variabel dengan nama multi-karakter diperluas, sebagai $CC sebaliknya akan diperluas ke nilai variabel C diikuti oleh C literal ($CC pada dasarnya akan sama dengan $(C)C dalam Makefile).
Namun di shell, karena memiliki sintaks yang berbeda, $(CC) adalah substitusi perintah yang akan diganti dengan keluaran menjalankan perintah CC . Jika tidak ada perintah seperti itu di sistem Anda, Anda akan melihat kesalahan "perintah tidak ditemukan".
Anda juga mungkin salah $(CC) untuk ${CC} yang, di shell, setara dengan $CC dalam kebanyakan keadaan. Kurung kurawal hanya diperlukan jika perluasan variabel segera diikuti oleh beberapa string lain yang akan ditafsirkan sebagai bagian dari nama variabel. Contoh perbedaannya bisa dilihat di "$CC_hello" (memperluas variabel yang disebut CC_hello ) dan "${CC}_hello" (memperluas variabel CC dan menambahkan string _hello ke nilainya). Dalam semua keadaan lainnya, ${CC} setara dengan $CC . Perhatikan bahwa penggunaan kurung kurawal tidak mengutip ekspansi, yaitu ${CC} adalah tidak sama dengan "$CC" .
Jika memiliki variabel shell atau lingkungan yang memuat nama kompiler yang Anda gunakan untuk mengompilasi kode C, dan Anda ingin menggunakan variabel tersebut pada baris perintah, maka gunakan "$CC" , atau cukup $CC jika nilai variabel tidak mengandung spasi atau karakter globbing shell.
$CC -o hello.elf hello.c
Keduanya tidak setara. Pada baris yang berisi $(foo) , $(foo) diganti dengan output dari perintah foo . Misalnya:
$ echo "hello $(echo world)"
hello world
Pada baris yang berisi $foo , $foo diganti dengan nilai variabel bernama foo . Misalnya:
$ foo=world
$ echo "hello $foo"
hello world