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