2009-08-24 6 views
20

Я читаю документ GNU Make. Вот примерЗнаки Four Dollar в Makefile

% .d:% .c

@set -e; rm -f [email protected]; \ 

    $(CC) -M $(CPPFLAGS) $< > [email protected]$$$$; \ 

    sed ’s,\($*\)\.o[ :]*,\1.o [email protected] : ,g’ < [email protected]$$$$ > [email protected]; \ 

    rm -f [email protected]$$$$ 

Я попробовал это на C++ программы, и получил список файлов

init3d.d init3d .d.18449 input.d input.d.18444 main.d main.d.18439

Вот что я нашел, но не знаю nderstand в том же document

Если вы включили вторичное расширение, и вы хотите буквальный знак доллара в списке предпосылок, вы должны фактически написать четыре знака доллара («$$$$»).

Интересно, что означают четыре знака доллара «$$$$»? Как они 18449, 18444 или 18439?

Спасибо и приветствую!

ответ

21

Если включена опция «вторичного расширения», то для получения единственного $ в фактическом выводе требуется $$$$. $ обычно используется для расширения переменных, функций вызова и т. Д. $$ с включенным вторичным расширением делает что-то еще, но в противном случае он генерирует фактический $ на выходе.

Оболочка, использующая для выполнения командных строк в Unix-подобных системах, обычно интерпретирует $$ как расширяемый для идентификатора процесса оболочки. Таким образом, без дополнительного расширения, $$$$ превратится в $$ на выходе, который оболочка будет расширена до идентификатора процесса.

(с использованием процессом оболочки ID в качестве суффикса является простым способом пытается гарантировать уникальность имени файла для временного файла.)

+0

Вторичное расширение не влияет на содержимое рецепта. Только список предварительных условий. Поэтому '$$$$' всегда будет вызывать '$$' в контексте рецепта. Вам нужно только '$$$$' в списке предварительных условий, чтобы получить один '' ', когда включено вторичное расширение (когда оно не использует' $$ ', вы получите это). –

+0

Это не ответ. Вторичное расширение не имеет значения. – reinierpost

+0

@reinierpost кажется, что у вас такие же трудности понимания, как и Этан Рейснер :) Оригинальный плакат говорил о вторичной экспансии, поэтому я и написал об этом. Фактическое объяснение приведено во втором абзаце, и наиболее вероятная причина использования этой конструкции приведена в третьем абзаце в скобках. –

2

18449, 18444 или 18439 выглядят как идентификаторы процессов, поэтому, возможно, идентификатор процесса?

16

$$ будет преобразована в $, но в правилах Makefile (которые являются оболочками выражения) вам также нужно будет избежать полученного $ с использованием \ или с помощью одинарных кавычек ' вокруг вашего выражения.

Ниже приведен пример, который демонстрирует его:

DOLLAR:=$$ 
dollar: 
    echo '$$' > [email protected] 
    echo "\$$" >> [email protected] 
    echo '$(DOLLAR)' >> [email protected] 
    echo "\$(DOLLAR)" >> [email protected] 
    cat dollar 
+1

Гоша, я тебя люблю. Я искал круглый год, почему '$$' для меня не раскрывается. – Profpatsch