Commande qui se termine avec un état zéro (pas / bin / true)?

11

J'ai un Makefile qui exécute un outil qui prend un peu de temps; cela me permet de remplacer la commande utilisée:

make TOOL=alternative-tool

J'aimerais sauter cette étape dans le Makefile, donc je cherche une commande qui se termine avec le statut 0, et qui a des effets secondaires négligeables.

Évidemment, je pourrais simplement utiliser true, mais c'est un peu déroutant:

make TOOL=true

Cela se lit comme si je voulais exécuter l'outil, mais je ne le fais pas.

Existe-t-il un exécutable installé par défaut qui ne se /bin/truetermine pas avec le statut 0 et qui a un nom accrocheur et facile à taper?

Roger Lipscombe
la source
Makefiles prend en charge les commentaires, gnu.org/software/make/manual/html_node/Makefile-Contents.html . Mettez un commentaire avant la ligne et documentez votre code. Cela réduit la confusion et explique pourquoi vous avez utilisé une certaine approche.
Freiheit
1
Quelle ligne? Le TOOL=truesera sur la ligne de commande lors de l'appel de make, probablement documenté dans un fichier README à proximité. La ligne réelle qui appelle l'outil se trouve quelque part dans un makefile de 7 000 lignes (tiers).
Roger Lipscombe

Réponses:

42

Même si vous avez demandé quelque chose qui n'est pas /bin/true", remplacer truepar le nom complet /bin/truepour montrer qu'il s'agit du trueprogramme plutôt que d'une autre signification de" vrai "est probablement la meilleure solution.

Votre préoccupation est que l' trueen

make TOOL=true

semble être autre chose qu'un nom de commande. Mais si vous écrivez

make TOOL=/bin/true

alors c'est sans équivoque une commande. Quelqu'un pourrait mal lire TOOL=truepour signifier qu'un autre outil quelque part est prévu, mais aucune telle mauvaise lecture TOOL=/bin/truen'est probable.


Je ne sais pas quand :, qui est un shell intégré mais pas une commande externe, fonctionnera. Henning Makholm a signalé que cela semble fonctionner . Mais je pense que cela ne fonctionne pas dans toutes les situations, et vous avez constaté que cela ne fonctionnait pas pour vous .

En ce qui concerne un alias de shell, vous ne pouvez pas l'utiliser car l'expansion d'alias n'est pas effectuée dans les arguments que vous passez à une commande, et les makefiles n'utilisent aucun alias de shell précédemment défini. Même s'il makeexécute vos commandes dans un nouveau shell, ce shell n'aura pas d'alias (et ne l'utilisera pas même s'il en avait un, car il s'agirait d'un shell non interactif, où l'expansion d'alias n'est pas automatiquement activée).

Eliah Kagan
la source
1
L'utilisation :semble bien fonctionner pour moi. makegénère toujours un shell pour exécuter chaque commande après avoir effectué ses propres substitutions.
hmakholm a quitté Monica le
@HenningMakholm Merci, j'ai édité. Vous voudrez peut-être publier une réponse. Lok Lam Cheng avait commenté la question à suggérer :, mais ce devrait être une réponse (surtout si elle est correcte) et ce commentaire n'explique pas pourquoi on devrait s'attendre à ce qu'elle fonctionne. Dans un répertoire hello.cet aucun makefile, où make hellocompiles hello.cà hello, je l' ai trouvé make CC=: hellocomportés selon ce que vous dites.
Eliah Kagan
2
Malheureusement, pour ce Makefile particulier (il utilise erlang.mk ), l'utilisation :ne fonctionne pas. Être explicite /bin/trueest probablement la meilleure façon de le faire.
Roger Lipscombe
7

Bien que je convienne que l'utilisation du chemin complet vers trueserait la meilleure solution, je voudrais noter ce qui est probablement de loin le moyen le plus courant d'éviter l'exécution de commandes réelles: coller un echodevant. Donc:

make TOOL=echo
muru
la source
Je pense que cela est parfois utile quand il est important de se rappeler que l'on a supprimé toute action qui TOOLferait autrement. Sans -sou équivalent, makeémet des informations redondantes, car les deux makeet la echocommande exécutée par makeémettent séparément une sortie. Par exemple, lorsque j'exécute make CC=echo hellodans un répertoire qui n'a hello.cpas de makefile, j'obtiens echo hello.c -o hellocomme première ligne de sortie et hello.c -o hellocomme seconde. Mais certaines versions utilisent (ou l'utilisateur peut ajouter) -s, puis c'est utile. make -s CC=echo hellodonne juste hello.c -o hello.
Eliah Kagan
(ce qui pourrait être utile si les commandes impliquent des extensions de shell, afin que vous puissiez avoir une idée plus claire de ce qui est exécuté, si cela vous intéresse)
muru
5

Vous pouvez toujours créer votre propre commande qui ne fait que renvoyer un état de sortie zéro. Quelques options:

  • un lien symbolique bien nommé vers /bin/true

  • un script shell vide

  • un programme C presque vide:

    int main() {
        return 0;
    }
David Foerster
la source
Un bon nom pour un tel programme serait noop ou no-op.
arp
0

Créez un lien symbolique dans le répertoire de travail vers / bin / true nommé quelque chose comme skip. Donc...

skip -> /bin/true

Ensuite, la ligne de fabrication peut être ...

make TOOL=./skip
DocSalvager
la source
-2

Voici un moyen de le faire avec un peu plus de caractères:

function T() { /bin/true; }

Après l'avoir fait une fois, vous pouvez le ré-exécuter simplement en utilisant le nom T.

false; T; echo $?
Lee B
la source
3
Pourriez-vous expliquer comment cette fonction peut être invoquée à partir d'une valeur de variable Make (pour être utile dans la situation en question)?
David Foerster