Befehl, der mit dem Status Null beendet wird (nicht / bin / true)?

11

Ich habe ein Makefile, auf dem ein Tool ausgeführt wird, das eine Weile dauert. es erlaubt mir, den verwendeten Befehl zu ersetzen:

make TOOL=alternative-tool

Ich möchte diesen Schritt im Makefile überspringen, daher suche ich nach einem Befehl, der mit dem Status 0 beendet wird und vernachlässigbare Nebenwirkungen hat.

Natürlich könnte ich nur verwenden true, aber das ist etwas verwirrend:

make TOOL=true

Das liest sich so, als ob ich das Tool ausführen möchte , aber ich tue es nicht.

Gibt es eine standardmäßig installierte ausführbare Datei, die nicht /bin/truemit dem Status 0 beendet wird und einen eingängigen und einfach einzugebenden Namen hat?

Roger Lipscombe
quelle
Makefiles unterstützen Kommentare, gnu.org/software/make/manual/html_node/Makefile-Contents.html . Stellen Sie einen Kommentar vor die Zeile und dokumentieren Sie Ihren Code. Das reduziert die Verwirrung und erklärt, warum Sie einen bestimmten Ansatz gewählt haben.
Freiheit
1
Welche Linie? Das TOOL=truewird beim Aufrufen von make in der Befehlszeile angezeigt, wahrscheinlich in einer README-Datei in der Nähe dokumentiert. Die eigentliche Zeile, die das Tool aufruft, befindet sich irgendwo in einem Makefile mit 7000 Zeilen (von Drittanbietern).
Roger Lipscombe

Antworten:

42

Obwohl Sie nach etwas gefragt haben, das "nicht /bin/true" ist, ist es wahrscheinlich die beste Lösung , durch trueden vollständigen Namen /bin/truezu ersetzen, um zu zeigen, dass es sich um das trueProgramm handelt und nicht um eine andere Bedeutung von "wahr".

Ihre Sorge ist, dass die truein

make TOOL=true

scheint etwas anderes als ein Befehlsname zu sein. Aber wenn du schreibst

make TOOL=/bin/true

dann ist das eindeutig ein Befehl. Jemand könnte falsch TOOL=trueverstehen, um zu bedeuten, dass irgendwo ein anderes Werkzeug vorgesehen ist, aber ein solches falsches Lesen TOOL=/bin/trueist wahrscheinlich nicht.


Ich bin mir nicht sicher, wann :, was eine eingebaute Shell, aber kein externer Befehl ist, funktionieren wird. Henning Makholm hat berichtet, dass es zu funktionieren scheint . Aber ich denke, es funktioniert nicht in allen Situationen, und Sie haben festgestellt, dass es bei Ihnen nicht funktioniert hat .

Bei einem Shell-Alias ​​können Sie dies nicht verwenden, da die Alias-Erweiterung nicht in den Argumenten ausgeführt wird, die Sie an einen Befehl übergeben, und Makefiles keine zuvor definierten Shell-Aliase verwenden. Selbst wenn makeIhre Befehle in einer neuen Shell ausgeführt werden, verfügt diese Shell nicht über den Alias ​​(und würde ihn auch dann nicht verwenden, wenn er vorhanden wäre, da es sich um eine nicht interaktive Shell handelt, bei der die Aliaserweiterung nicht automatisch aktiviert wird).

Eliah Kagan
quelle
1
Die Verwendung :scheint für mich gut zu funktionieren. makeerzeugt immer eine Shell, um jeden Befehl auszuführen, nachdem er seine eigenen Ersetzungen vorgenommen hat.
Hmakholm über Monica
@ HenningMakholm Danke, ich habe bearbeitet. Vielleicht möchten Sie eine Antwort posten. Lok Lam Cheng hatte die Frage kommentiert, um sie vorzuschlagen :, aber es sollte eine Antwort sein (besonders wenn sie richtig ist) und dieser Kommentar erklärt nicht, warum man erwarten sollte, dass sie funktioniert. In einem Verzeichnis mit hello.cund ohne Make - Datei, wo make hellocompiliert hello.czu hello, fand ich make CC=: helloverhielt sich nach dem , was Sie sagen.
Eliah Kagan
2
Leider funktioniert die Verwendung für dieses spezielle Makefile (es verwendet erlang.mk ) :nicht. Es /bin/trueist wahrscheinlich der beste Weg, dies explizit zu tun.
Roger Lipscombe
7

Obwohl ich damit einverstanden bin, dass die Verwendung des vollständigen Pfads truedie beste Lösung wäre, möchte ich darauf hinweisen, was wahrscheinlich bei weitem der häufigste Weg ist, um eine echte Befehlsausführung zu vermeiden: einen echodavor zu halten. So:

make TOOL=echo
muru
quelle
Ich denke, dies ist manchmal nützlich, wenn es wichtig ist, daran erinnert zu werden, dass man alles unterdrückt, was TOOLsonst tun würde. Ohne -soder gleichwertig werden makeredundante Informationen ausgegeben , da beide makeund der echovon makeseparat ausgeführte Befehl eine Ausgabe ausgeben. Wenn ich zum Beispiel make CC=echo helloin einem Verzeichnis hello.cohne Makefile laufe , erhalte ich echo hello.c -o helloals erste Ausgabezeile und hello.c -o helloals zweite. Aber einige Builds verwenden (oder der Benutzer kann hinzufügen) -s, und dann ist es hilfreich. make -s CC=echo hellogibt nur hello.c -o hello.
Eliah Kagan
(was immer noch nützlich sein kann, wenn die Befehle Shell-Erweiterungen beinhalten, damit Sie bei Interesse eine klarere Vorstellung davon bekommen, was ausgeführt wird)
muru
5

Sie können jederzeit einen eigenen Befehl erstellen, der nur den Exit-Status Null zurückgibt. Einige Optionen:

  • eine entsprechend benannte symbolische Verknüpfung zu /bin/true

  • ein leeres Shell-Skript

  • ein fast leeres C-Programm:

    int main() {
        return 0;
    }
David Foerster
quelle
Ein guter Name für ein solches Programm wäre noop oder no-op.
Arp
0

Erstellen Sie im Arbeitsverzeichnis einen symbolischen Link zu / bin / true mit dem Namen so etwas wie skip. Somit...

skip -> /bin/true

Dann kann die make line sein ...

make TOOL=./skip
DocSalvager
quelle
-2

Hier ist eine Möglichkeit, dies mit etwas mehr Zeichen zu tun:

function T() { /bin/true; }

Nachdem Sie es einmal getan haben, können Sie es einfach unter Verwendung des Namens erneut ausführen T.

false; T; echo $?
Lee B.
quelle
3
Könnten Sie bitte erklären, wie diese Funktion von einem Wert für die Variable Make aus aufgerufen werden kann (um in der betreffenden Situation von Nutzen zu sein)?
David Foerster