2010-09-14 7 views
33

J'essaie de forcer faire fichier à afficher la chaîne suivante:

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

Le problème est avec "$PATH". Commande

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

la cause d'un résultat

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

toutes les combinaisons de caractères échappement, citations, "$(shell echo " n'a pas obtenu les résultats nécessaires ...

Toutes les suggestions?

Répondre

37

Dans le manual for GNU make, ils parlent de cet exemple spécifique pour décrire la fonction value:

La fonction de valeur fournit un moyen pour vous d'utiliser la valeur d'une variable sans l'avoir élargi. S'il vous plaît noter que cela ne annuler les expansions qui ont déjà eu lieu; Par exemple, si vous créez une variable simplement développée, sa valeur est étendue pendant la définition ; dans ce cas, la fonction de valeur retournera le même résultat que si vous utilisiez la variable directement.

La syntaxe de la fonction de valeur est la suivante:

$(value variable) 

Notez que la variable est le nom d'une variable; pas une référence à cette variable. Par conséquent, vous n'utilisez normalement pas un '$' ou des parenthèses lors de l'écriture. (Vous pouvez toutefois utiliser une référence variable au nom si vous voulez que le nom ne soit pas une constante. )

Le résultat de cette fonction est une chaîne contenant la valeur de la variable , sans aucune extension se produisant . Par exemple, dans ce makefile:

FOO = $PATH 

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

La première ligne de sortie serait ATH, puisque le « $ P » serait étendu comme une variable de marque, tandis que la seconde ligne de sortie serait la valeur actuelle de votre $ PATH environnement variable, puisque la fonction de valeur a évité l'expansion.

+0

Merci de signaler que la déclaration de variable est faite en dehors de la cible. Peuvent-ils être définis à l'intérieur d'une cible? – Crt

12

Le make utilise le $ pour son propre . Par exemple. variable à caractère unique $A ou variable avec un nom long - ${VAR} et $(VAR).

Pour mettre la $ dans une commande, utilisez le $$, par exemple:

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

Notez également que pour make la "" et '' (double et simple citation) ne jouent aucun rôle et ils sont passés verbatim à la coquille. (Supprimez le signe @ pour voir ce que make envoie à shell.) Pour empêcher l'expansion du shell $PATH, la deuxième ligne utilise le ''.

+0

Merci, vous m'avez donné la direction! @echo "setenv PATH/usr/local/greenhills/mips5/linux86: $$ PATH" cas à l'ensemble $ PATH à imprimer, mais @echo 'setenv CHEMIN/usr/local/greenhills/mips5/linux86: $$ PATH ' fait le travail! – BaruchLi

+0

Parce que, comme je l'ai noté le '" "' et '''' sont passés au shell. A l'intérieur du shell '" "' étendrait le '$ PATH', mais pas à l'intérieur de' ''' '. – Dummy00001

+0

Merci pour le rappel depuis si longtemps que je l'utilise make –