Linux - переменные среды $ HOME против $ (HOME) - PullRequest
4 голосов
/ 20 августа 2010

Недавно мне пришлось обновить переменную среды JAVA в .bashrc

echo $ JAVA_HOME # выводит на печать /usr/java/...

echo $ (JAVA_HOME)# выдает ошибку "не удается найти команду JAVA_HOME"

Я беспокоюсь, что мой make-файл, который использует $(JAVA_HOME), не будет работать, так как $JAVA_HOME распознается, но не $(JAVA_HOME)

Как я могу получить $(JAVA_HOME) равным $JAVA_HOME, который в настоящее время установлен?Кроме того, почему это происходит?

спасибо

Ответы [ 6 ]

12 голосов
/ 20 августа 2010

make не bash

Они имеют дело с переменными по-разному.$foo это то, как вы читаете переменную с именем foo в bash, а $(foo) это то, как вы читаете ее в make-файле.

5 голосов
/ 20 августа 2010

Точнее:

  • JAVA_HOME - переменная оболочки;при условии, что он был экспортирован с export, он становится переменной среды.
  • $JAVA_HOME - это синтаксис bash для расширения переменной оболочки с именем JAVA_HOME.
  • In bash, $(command) заменяет вывод command - поэтому $(JAVA_HOME) пытается запустить команду с именем JAVA_HOME, поэтому вы получили ошибку.
  • Когда запускается make, онпросматривает каждую переменную окружения и устанавливает переменную make с тем же именем на то же значение.(См. http://www.gnu.org/software/make/manual/make.html#Environment.)
  • $(JAVA_HOME) - это синтаксис make для расширения переменной make с именем JAVA_HOME.

Итак, ваш Makefile должно работать просто отлично: $(JAVA_HOME) раскрывает make переменную JAVA_HOME, для которой было установлено значение переменной среды JAVA_HOME (если только Makefile не сделал преднамеренно что-то для ее переопределения), что имеет правозначение.

2 голосов
/ 20 августа 2010

В: Будет ли мой make-файл читать переменные окружения?Если я определю $ JAVA_HOME в .bashrc, мой файл make будет правильно читать $ (JAVA_HOME)?

A: Да, абсолютно:)

1 голос
/ 20 августа 2010

... и $ {foo} или $ {HOME} тоже разрешены в bash, но для HOME это редко требуется. Это полезно для конкатенации, потому что $ {HOME} OFFICE расширится до / home / stefanOFFICE на моей машине, но мне это не нужно, пока $ HOMEOFFICE совершенно неизвестен; $ HOME не расширен.

$ HOME часто объединяется, но с косой чертой, которой достаточно, чтобы разделить переменную, поэтому $ {HOME} / bin и $ HOME / bin работают оба.

1 голос
/ 20 августа 2010

Причина различия между $ JAVA_HOME и $ (JAVA_HOME) заключается в том, что у make синтаксис для переменных отличается от синтаксиса bash.

1 голос
/ 20 августа 2010

make установит свои переменные в окружение.(обратное неверно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...