2010-09-18 6 views
15

J'ai le code suivant dans un Makefile:Makefile - Pourquoi la commande de lecture ne lit-elle pas l'entrée de l'utilisateur?

# Root Path 
echo "What is the root directory of your webserver? Eg. ~/Server/htdocs" ; 
read root_path ; 
echo $root_path ; 
if [ ! -d $root_path ] ; then \ 
    echo "Error: Could not find that location!" ; exit 1 ; \ 
fi 

Cependant, lorsque tout en tapant (. Par exemple « asd ») c'est ce qui est retourné:

What is the root directory of your webserver? Eg. ~/Server/htdocs 

asd 
oot_path 
Error: Could not find that location! 

Quand ce que j'attendre à voir serait être:

What is the root directory of your webserver? Eg. ~/Server/htdocs 

asd 
asd 
Error: Could not find that location! 

Comment résoudre ce problème ???

+0

Voter pour cette question parce que je pense qu'il revient probablement à plusieurs reprises, mais voir ce que Greg, John et Daenyth disent à propos de faire réellement cela: * le meurtre de hache qui maintient votre code ** ne ** l'aime pas. * – dmckee

Répondre

19

Le problème immédiat est que Make lui-même interprète le $ différemment que le shell. Essayez:

echo "What is the root directory of your webserver? Eg. ~/Server/htdocs"; \ 
    read root_path; \ 
    echo $$root_path 

Le double $$ échappe à l'$ Make, il passe le $ unique à travers la coquille. Notez également que vous devrez utiliser les suites de lignes \ pour que toute la séquence soit exécutée en tant que script shell, sinon Make engendrera un nouveau shell nouveau pour chaque ligne. Cela signifie que tout ce que vous read disparaîtra dès que son obus sortira.

Je voudrais aussi dire qu'en général, l'invite pour l'entrée interactive d'un Makefile est rare. Il serait peut-être préférable d'utiliser un commutateur de ligne de commande pour indiquer le répertoire racine du serveur Web.

+4

En second lieu, l'idée de "demander l'entrée interactive est rare". Vous ne voulez pas avoir à répondre à une invite chaque fois que vous tapez 'make'. –

+1

Je serais/peu commun/une abomination /. C'est ce que les scripts 'configure' et les variables sont pour – Daenyth

+0

Merci! J'ai toujours pensé que Makefiles n'était que des scripts shell glorifiés, mais cela montre clairement le contraire. Va certainement devoir reconsidérer mes cas d'utilisation avec eux. @Daenyth, que voulez-vous dire par des scripts de configuration? Sont-ils quelque chose de spécial ??? – balupton