84 votes

Est-ce que GNU peut gérer les noms de fichiers avec des espaces?

J'ai un répertoire contenant plusieurs fichiers, dont certains ont des espaces dans leur nom:

Test workspace/
Another directory/
file1.ext
file2.ext
demo 2012-03-23.odp

J'utilise GNU - $(wildcard) commande sur ce répertoire, puis itérer sur le résultat de l'utilisation d' $(foreach), l'impression de tout. Voici le code:

FOO := $(wildcard *)
$(info FOO = $(FOO))
$(foreach PLACE,$(FOO),$(info PLACE = $(PLACE)))

Voici ce à quoi je m'attends à voir imprimés:

Test workspace
Another directory
file1.ext
file2.ext
demo 2012-03-23.odp

Voici ce que j'ai réellement obtenir:

Test
workspace
Another
directory
file1.ext
file2.ext
demo
2012-03-23.odp

Ce dernier est évidemment d'aucune utilité pour moi. La documentation pour l' $(wildcard) flat-out états qu'il renvoie d'un "espace-liste séparée par des noms", mais échoue complètement à reconnaître les énormes problèmes que cela pose. Ni la documentation pour $(foreach).

Est-il possible de contourner ce problème? Si oui, comment? Renommer chaque fichier et chaque répertoire à supprimer les espaces n'est pas une option.

63voto

Jan Hudec Points 27417

Le bug #712 suggère de faire ne gère pas les noms avec des espaces. Nulle part, jamais.

J'ai trouvé un post de blog en disant que c'est en partie mis en œuvre par la fuite, les espaces avec \\, mais:

  • Il ne fonctionne pas dans toutes les fonctions à l'exception des $(wildcard).
  • Il ne fonctionne pas lors de l'extension des listes de noms de variables, ce qui inclut les variables spéciales $?, $^ et $+ ainsi que toute variable définie par l'utilisateur. Ce qui signifie que tout $(wildcard) correspondra à corriger les fichiers, vous ne serez pas en mesure d'interpréter le résultat de toute façon.

De manière explicite ou très simple motif de règles que vous pouvez obtenir pour travailler, mais au-delà de ce que vous êtes hors de la chance. Vous aurez à chercher un autre système de construction qui prend en charge les espaces. Je ne suis pas sûr de savoir si la confiture/bjam n', scons, waf, ant, nant et msbuild tout devrait fonctionner.

24voto

Paul Draper Points 14352

GNU Make fait très mal avec séparées par un espace de noms de fichiers.

Les espaces sont utilisés comme séparateurs dans la liste de mots dans tous les sens.

Ce blog résume bien la situation, mais attention: il utilise à tort \\ plutôt que \

target: some\ file some\ other\ file

some\ file some\ other\ file:
    echo done

Vous pouvez également utiliser des variables, donc, ce serait également le travail

VAR := some\ file some\ other\ file

target: $(VAR)

$(VAR):
    echo done

Seulement l' wildcard fonction reconnaît la fuite, de sorte que vous ne pouvez pas faire quelque chose de compliqué, sans beaucoup de douleur.


Mais n'oubliez pas que votre shell utilise les espaces comme des séparateurs trop.

Si je voulais changer l' echo done de touch $@, j'aurais à ajouter slash sortir de ma coquille.

VAR := some\ file

target: $(VAR)

$(VAR):
    touch $(subst \,\\,$@)

ou, plus probablement, utilisez des guillemets

VAR := some\ file some\ other\ file

target: $(VAR)

$(VAR):
    touch '$@'

En fin de compte, si vous voulez éviter beaucoup de douleur, à la fois dans GNU make, et dans votre coquille, ne pas mettre des espaces dans les noms de fichiers. Si vous le faites, espérons-le, les capacités limitées de la Faire sera suffisant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X