Tengo un directorio que contiene varios archivos, algunos de los cuales tienen espacios en sus nombres:
Test workspace/
Another directory/
file1.ext
file2.ext
demo 2012-03-23.odp
Yo uso GNU $(wildcard)
comando en este directorio, y luego iterar sobre el resultado del uso de $(foreach)
, impresión de todo lo que fuera. Aquí está el código:
FOO := $(wildcard *)
$(info FOO = $(FOO))
$(foreach PLACE,$(FOO),$(info PLACE = $(PLACE)))
Aquí es lo que yo esperaría a ver impreso:
Test workspace
Another directory
file1.ext
file2.ext
demo 2012-03-23.odp
Aquí es lo que realmente conseguir:
Test
workspace
Another
directory
file1.ext
file2.ext
demo
2012-03-23.odp
El último es obviamente de ninguna utilidad para mí. El documentación para $(wildcard)
de plano los estados que devuelve una «lista separada por espacios de nombres», pero es totalmente incapaz de reconocer los enormes problemas que esto conlleva. Tampoco el documentación para $(foreach)
.
Es posible evitar esto? Si es así, ¿cómo? Cambiar el nombre de cada archivo y directorio para quitar los espacios no es una opción.
El error #712 sugieren que el no manejar con espacios en el nombre. Nada, nunca.
He encontrado una blog post diciendo que es parcialmente implementado por escapar de los espacios con
\
(\\
parece ser un error de escritura o de formato artefacto), pero:$(wildcard)
.$?
,$^
y$+
así como cualquier variable definida por el usuario. Que a su vez significa que mientras$(wildcard)
coincidirá con archivos correctos, usted no será capaz de interpretar el resultado de todos modos.De modo explícito o patrón muy simple reglas puede llegar a trabajar, pero más allá de que usted está fuera de suerte. Usted tendrá que buscar algún otro sistema de construcción que no admite espacios. No estoy seguro de si jam/bjam hace, scons, waf, ant, nant y msbuild todo debería de funcionar.
$?
y[email protected]
. Si usted está interesado, véase mi respuesta a continuación. y Louis, que está mal, que hace el trabajo. Siéntase libre de probar por ti mismoGNU Make hace muy poco con espacio separado los nombres de archivo.
Se utilizan espacios como delimitadores en la lista de palabras por todo el lugar.
Este blog resume bien la situación, pero ADVERTENCIA: se utiliza incorrectamente \\ en lugar de \
También puede utilizar variables, por lo que este sería también el trabajo
Sólo el
wildcard
función reconoce el escape, por lo que no puede hacer nada apetece sin un montón de dolor.Pero no olvides que tu shell utiliza espacios como delimitadores demasiado.
Si yo quería cambiar el
echo done
atouch [email protected]
, tendría que agregar barra de escapar de mi concha.o, más probablemente, el uso de comillas
Al final, si se desea evitar un montón de dolor, tanto en GNU make, y en su concha, no poner espacios en sus nombres de archivo. Si lo hace, esperemos que las capacidades limitadas de Hacer será suficiente.
$(shell ...)
para hacer iniciales manipulaciones, por suerte.Este método también permite el uso de la lista de nombres de archivo, tales como
$?
y las variables de usuario que son listas de archivos.La mejor manera de lidiar con espacios en Hacer es sustituir los espacios por otros personajes.
Salidas
Usted puede, a continuación, de forma segura de manipular las listas de los nombres de archivo utilizando todo el Make de GNU
funciones. Sólo asegúrese de quitar el +’s antes de usar estos nombres en una regla.
Salidas
Esta info es todo desde el blog que todo el mundo estaba publicando.
La mayoría de las personas parecen estar recomendando no usar espacios en las rutas de acceso o el uso de Windows 8.3 caminos, pero si debe usar espacios, escapando de los espacios y la sustitución de las obras.
+
en ella?Si usted está dispuesto a confiar en su caparazón un poco más, esto le da una lista que puede contener nombres con espacios muy bien:
A la pregunta original, dijo que «el cambio de nombre no es una opción», sin embargo, muchos comentaristas han señalado que el cambio de nombre es casi la única manera de Hacer que puede manejar espacios. Sugiero un camino medio: Uso que se hace para cambiar temporalmente el nombre de los archivos y, a continuación, cambiar el nombre de ellos de nuevo. Esto le da todo el poder de Hacer con reglas implícitas y otras bondad, pero no estropear su esquema de nomenclatura de archivos.
Puede llamar a estos objetivos mediante la mano con
make nospaces
ymake yesspaces
, o usted puede tener otros objetivos depende de ellos. Por ejemplo, usted podría querer tener un «empuje» target, lo que permite asegurarse de poner los espacios en los nombres de archivo antes de la sincronización de archivos con un servidor:[Nota al margen: yo probé la respuesta que sugiere el uso de
+s
ys+
pero a mi Makefile más difícil de leer y depurar. Me dio cuando me dio disparates sobre reglas implícitas le gusta:%.wav : %.ogg ; oggdec "$<"
.]