2009-08-24 20 views
20

Estoy leyendo el documento de GNU Make. Este es un ejemploCuatro signos de dólar en 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]$$$$ 

He intentado esto en un programa en C++, y tengo la lista de archivos

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

Esto es lo que encontré, pero no lo hacen nderstand en la misma document

Si ha activado la expansión secundaria y desea un signo de dólar literal en la lista de requisitos previos, se debe escribir en realidad cuatro signos de dólar (‘$$$$’).

Me pregunto qué significan los cuatro signos de dólar "$$$$" en realidad? ¿Cómo son ellos 18449, 18444 o 18439?

¡Gracias y saludos!

Respuesta

21

Si se habilita la "expansión secundaria", se requiere $$$$ para generar un solo $ en la salida real. $ se usa normalmente para expandir variables, llamar a make functions, etc. $$ con expansión secundaria habilitada hace algo más, pero de lo contrario genera un $ real en la salida.

El intérprete de comandos que utiliza para ejecutar líneas de comando en sistemas tipo Unix normalmente interpreta $$ como expandir a la ID del proceso del shell. Entonces, sin la expansión secundaria habilitada, $$$$ se convertirá en $$ en la salida, que el shell expandirá a la ID del proceso.

(Utilizando el ID de proceso shell como un sufijo es una manera simple de tratar de garantizar la unicidad del nombre del archivo para un archivo temporal.)

+0

expansión secundaria no afecta a los contenidos de la receta. Solo la lista de requisitos previos. Entonces '$$$$' siempre producirá '$$' en el contexto de la receta. Solo necesita '$$$$' en la lista de requisitos previos para obtener un solo '$' cuando la expansión secundaria está activada (cuando no está usando '$$' obtendrá eso). –

+0

Esta no es la respuesta. La expansión secundaria es irrelevante. – reinierpost

+0

@reinierpost parece que tienes las mismas dificultades de comprensión que Etan Reisner :) El cartel original hablaba de expansión secundaria, por eso escribí sobre él. La explicación real está en el segundo párrafo, y la razón más probable para usar esa construcción está en el tercer párrafo entre paréntesis. –

2

18449, 18444 o 18439 parecen identificadores de proceso, ¿tal vez una ID de proceso?

16

$$ se convertirá en $, pero en reglas Makefile (que son la cáscara expresiones) también tendrá que escapar del resultado $ usando un \ o usando comillas simples ' alrededor de su expresión.

Aquí es un ejemplo que demuestra que:

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

Gosh, te amo. He buscado una y otra vez por qué '$$' se expande en la nada para mí. – Profpatsch

Cuestiones relacionadas