В чем разница между $(CC) и $CC?

И чтобы ответить на мой собственный вопрос:

благодаря сопровождающим проекта я обнаружил, что исходная команда "неверна"

Правильный вариант должен использовать sourceв качестве имени группы томов.

lxc storage create pool1 lvm source=<vg_name> lvm.thinpool_name=<thinpool_name>
6
18.03.2020, 04:41
3 ответа

Я предполагаю, что вы видели $(CC)в Makefile, где он служит расширением переменной CC, которая обычно содержит имя компилятора C. Синтаксис $(...)для расширения переменных в файлах Makefile используется всякий раз, когда расширяется переменная с многосимвольным именем -, поскольку в противном случае $CCрасширялось бы до значения переменной C, за которым следует литерал C($CC. в действительности будет таким же, как $(C)Cв Makefile ).

Однако в оболочке из-за другого синтаксиса $(CC)— это подстановка команды, которая будет заменена выводом выполнения команды CC. Если в вашей системе нет такой команды, вы увидите ошибку «команда не найдена».

Также возможно, что вы перепутали $(CC)с ${CC}, что в оболочке эквивалентно $CCв большинстве случаев. Фигурные скобки нужны только в том случае, если за расширением переменной следует сразу какая-то другая строка, которая в противном случае интерпретировалась бы как часть имени переменной. Пример разницы можно увидеть в"$CC_hello"(расширяет переменную с именемCC_hello"${CC}_hello"(расширяет переменную CCи добавляет строку _helloк ее значению ). Во всех остальных случаях ${CC}эквивалентно $CC. Обратите внимание, что использование фигурных скобок — это , а не цитирование расширения, т. е. ${CC}— это , а не , то же, что "$CC".

Если у вас есть переменная оболочки или среды, содержащая имя компилятора, который вы используете для компиляции кода C, и вы хотите использовать эту переменную в командной строке, используйте "$CC"или просто $CC, если значение переменной не содержит пробелов или подстановочных символов оболочки.

$CC -o hello.elf hello.c
18
28.04.2021, 23:20

Они не эквивалентны. В строке, содержащей $(foo), $(foo)заменяется выводом команды foo. Например:

$ echo "hello $(echo world)"
hello world

В строке, содержащей $foo, $fooзаменяется значением переменной с именем foo. Например:


$ foo=world
$ echo "hello $foo"
hello world
4
28.04.2021, 23:20

Этот ответ не учитывает синтаксис make-файла.

"$(CC)"— это вывод команды CC.

"$CC"— значение переменной CC.

Это должно прояснить разницу:

$ CC=ls
$ echo $(CC)
CC: command not found
$ echo $CC
ls

и

$ echo $($CC)
bin   cdrom  dev  home        initrd.img.old  lost+found  mnt  proc  run...
1
28.04.2021, 23:20

Теги

Похожие вопросы