Подтвердить что ты не робот

Знаки Four Dollar в Makefile

Я читаю документ GNU Make. Вот пример

%. 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]$$$$

Я попробовал это на С++-программе и получил список файлов

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

Вот что я нашел, но не понимаю в том же документе

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Вот пример, демонстрирующий это:

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

Ответ 3

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