2010-09-14 7 views
33

sto cercando di forzare rendere il file da visualizzare accanto stringa:

"Please execute next commands: 
setenv PATH /usr/local/greenhills/mips5/linux86:$PATH" 

Il problema è con "$PATH". Comando

@echo "setenv PATH /usr/local/greenhills/mips5/linux86:$PATH" 

causare un risultato

"setenv PATH /usr/local/greenhills/mips5/linux86:ATH" 

qualsiasi combinazione di caratteri di escape, le citazioni, i risultati "$(shell echo " non ha ottenuto il termine ...

Qualche suggerimento?

risposta

37

Nel manual for GNU make, si parla di questo esempio specifico quando descrive la funzione value:

La funzione valore fornisce un modo per utilizzare il valore di una variabile senza averlo espanso. Si noti che questo non fa annullare le espansioni che si sono già verificate; ad esempio se crei una variabile semplicemente espansa, il suo valore viene espanso durante la definizione ; in tal caso la funzione valore restituirà lo stesso risultato di utilizzando direttamente la variabile.

La sintassi della funzione valore è:

$(value variable) 

noti che variabile è il nome di una variabile; non un riferimento a quella variabile. Di conseguenza, normalmente non si utilizza a "$" o parentesi quando lo si scrive. (È possibile, tuttavia, utilizzare un riferimento variabile nel nome, se si desidera che il nome non sia una costante .)

Il risultato di questa funzione è una stringa contenente il valore della variabili, senza alcuna espansione che si verificano . Ad esempio, in questo makefile:

FOO = $PATH 

all: 
     @echo $(FOO) 
     @echo $(value FOO) 

La prima linea di uscita sarebbe ATH, in quanto il “$ P” sarebbe esteso come variabile marca, mentre la seconda linea di uscita sarebbe il valore corrente della vostra $ PATH environment variabile, poiché la funzione value ha evitato l'espansione.

+0

Grazie per aver sottolineato che la dichiarazione delle variabili viene eseguita al di fuori dell'obiettivo. Possono essere definiti all'interno di un obiettivo? – Crt

12

Il make utilizza il $ per il proprio variable expansions. Per esempio. variabile a carattere singolo $A o variabile con un nome lungo - ${VAR} e $(VAR).

Per mettere il $ in un comando, utilizzare il $$, ad esempio:

all: 
    @echo "Please execute next commands:" 
    @echo 'setenv PATH /usr/local/greenhills/mips5/linux86:$$PATH' 

Si noti inoltre che per make il "" e '' (doppia e singola citazione) non giocano alcun ruolo e sono passati alla lettera alla shell. (Rimuovere il segno @ per vedere cosa invia make alla shell.) Per impedire l'espansione della shell $PATH, la seconda riga utilizza lo ''.

+0

Grazie, mi hai dato la direzione! @echo "PATH setenv/usr/local/greenhills/mips5/linux86: $$ PATH" case to whole $ PATH da stampare, ma @echo 'setenv PATH/usr/local/greenhills/mips5/linux86: $$ PATH ' Fai il lavoro! – BaruchLi

+0

Perché, come ho notato, "" "e' "" sono passati alla shell. All'interno della shell "" "' si espande il '$ PATH', ma non all'interno di' '' '. – Dummy00001

+0

Grazie per il promemoria, è passato molto tempo da quando ho usato make –