Знаки 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?
Спасибо и приветствую!
Ответы
Ответ 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 выглядят как идентификаторы процессов, поэтому, возможно, идентификатор процесса?