2010-09-18 9 views
15

Tengo el siguiente código dentro de un Makefile:Makefile - ¿Por qué el comando de lectura no lee la entrada del usuario?

# 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 

Sin embargo, cuando escribir nada (. Por ejemplo, "TEA") esto es lo que se volvió:

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

asd 
oot_path 
Error: Could not find that location! 

Cuando lo que se esperaría para ver lo haría ser:

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

asd 
asd 
Error: Could not find that location! 

¿Cómo puedo arreglar esto ???

+0

Votando para esta pregunta porque creo que probablemente aparece repetidas veces, pero vea lo que Greg, John y Daenyth dicen sobre hacer esto: * el asesinato de hacha que a continuación mantiene su código ** no ** me gustará. * – dmckee

Respuesta

19

El problema inmediato es que Make interpreta el $ de forma diferente que el shell. Probar:

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

La doble $$ escapa a la $ para el maquillaje, por lo que pasa el único $ a través de la cáscara. Tenga en cuenta también que deberá usar las continuas de línea \ para que la secuencia completa se ejecute como un script de shell, de lo contrario Make generará un nuevo shell para cada línea. Eso significa que cualquier cosa que read desaparezca tan pronto como salga su caparazón.

También diría que, en general, es poco común solicitar mensajes interactivos desde un Makefile. Tal vez sea mejor que use un interruptor de línea de comando para indicar el directorio raíz del servidor web.

+4

Secundar la idea de "solicitar entrada interactiva no es común". No desea tener que responder un mensaje cada vez que escriba 'make'. –

+1

I s s/uncommon/an abomination /. Eso es lo que 'configure' scripts y make variables son para – Daenyth

+0

¡Gracias! Siempre pensé que los Makefiles eran scripts de shell glorificados, pero esto definitivamente muestra lo contrario. Definitivamente tendré que reconsiderar mis casos de uso con ellos. @Daenyth, ¿qué quieres decir con configurar scripts? ¿Son algo especial? – balupton

Cuestiones relacionadas