Il semble que la fonction baseName comme interprétée par GNU marque n'est pas la même que celle de Bash's Basename. L'ancien lande le suffixe, tandis que ces derniers dépouilleront également le chemin. Comment puis-je obtenir le nom de base d'un dossier dans mon maquillage? P>
En outre, pourquoi ont-ils changé? (Cela m'a fallu 20 minutes pour trouver la source de mon erreur) p>
4 Réponses :
Ouais, c'est bizarre. Vous pouvez obtenir le comportement que vous voulez en chaînant Notdir et Basename < / a>: donc, par exemple, vous pouvez convertir /home/ari/src/helloworld.c code> sur
helloworld.html code > En salariant des fonctions telles que ceci: p>
YA, j'ai pensé à ce problème, si votre nom est un répertoire (lequel il est dans mon cas), Notdir bandes le tout. Donc $ (nodir $ (curdir)) code> donne une valeur nulle (ou peut-être un espace).
@ari - hmm. Rusé. Qu'en est-il de tricherie et d'utiliser Shell A > Appeler le nom BASEName de Shell () CODE>?
Vous devriez peut-être faire cela, mais il est tellement aggravant de devoir recourir à un appel de coquillage, surtout quand ils ont une fonction basseName qui n'a aucune activité opérant de quelque manière que ce soit que le nom de Basename de Shell. C'est juste que puisqu'il y a plus d'une façon de le faire dans Bash (par exemple, basseName pwd code>,
$ {pwd ## * /} code>), j'ai pensé qu'il doit y avoir à < I> moins i> une façon de le faire sans recourir à un appel de coquillage.
@ari: notdir code> est une fonction de texte basée sur texto afin qu'il ne sait pas si le nom que vous lui donnez fait référence à un répertoire ou non. Si toutefois, vous le présentez avec quelque chose comme / chemin / du chemin / de / dir / i>, bien sûr, il suffira de tout dépouiller jusqu'à ce que la barre oblique finale, comme il est documenté. Vous voulez
$ (nodir $ (curdir:% / =%)) code> Si vous souhaitez autoriser la spécification bâclée des répertoires avec une barre oblique de fuite.
@John, si vous écrivez cela comme une réponse séparée, je l'accepterai.
Vous pouvez toujours utiliser la version de Bash:
SHELL := /bin/bash basename := $(shell basename /why/in/gods/name)
Je suppose que le Certainement dans un maquillage, il est utile de pouvoir convertir foo / bar / baz.c em> to foo / bar / baz em> afin que vous puissiez clouer un nouveau suffixe sur la fin pour construire un nom de fichier associé dans le même répertoire qu'un fichier source. p> Les commentaires sur @ire_and_curses Réponse NOTE QUE et le code basseName (1) code> dispose de deux fonctionnalités orthogonales - suffit aux suffrages de décapage, à dénuder des portions de directeurs de premier plan - et les auteurs de GNU souhaitent pouvoir invoquer chaque fonctionnalité séparément. Et bien sûr, un seul concept pourrait obtenir le nom basename em>.
$ (NOTDIR $ (CURDIR)) CODE> ne suffit pas Pour vos besoins, comme (étant un répertoire) Curdir peut avoir été spécifié comme P>
notdir code> bandes le tout en raison de la barre oblique . Pour permettre cette façon d'écrire un chemin de répertoire, vous devez supprimer une barre oblique de fuite explicitement avec E.G.
$ (nodir $ (CURDIR:% / =%)) code>. p> p>
Existe-t-il un moyen de modifier cela pour tenir compte du fait qu'il peut être accidentellement deux i> slashes à la fin d'un chemin? Il y a un $ (abspath ...) code> fonctionnerait le chemin, mais il ne peut pas être utilisé avec le
:% / =% code>.
:% / =% code> est juste un raccourci pour
Patsubst code>, vous pouvez donc écrire
$ (Patsubst% /,%, $ (ABSPATH $ (BOB))) code>. Cependant, comme
Abspath code> prend en charge les barres obliques elles-mêmes, vous n'aurez pas besoin du
Patsubst code> là-bas.
Comment sur https://www.gnu.org/ Logiciel / Marque / Manuelle / HTML_Node / Nom du fichier-Fonctions.html P> $ (dir /path/to/file.txt) code>? p>