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/true
mit dem Status 0 beendet wird und einen eingängigen und einfach einzugebenden Namen hat?
command-line
Roger Lipscombe
quelle
quelle
TOOL=true
wird 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).Antworten:
Obwohl Sie nach etwas gefragt haben, das "nicht
/bin/true
" ist, ist es wahrscheinlich die beste Lösung , durchtrue
den vollständigen Namen/bin/true
zu ersetzen, um zu zeigen, dass es sich um dastrue
Programm handelt und nicht um eine andere Bedeutung von "wahr".Ihre Sorge ist, dass die
true
inscheint etwas anderes als ein Befehlsname zu sein. Aber wenn du schreibst
dann ist das eindeutig ein Befehl. Jemand könnte falsch
TOOL=true
verstehen, um zu bedeuten, dass irgendwo ein anderes Werkzeug vorgesehen ist, aber ein solches falsches LesenTOOL=/bin/true
ist 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
make
Ihre 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).quelle
:
scheint für mich gut zu funktionieren.make
erzeugt immer eine Shell, um jeden Befehl auszuführen, nachdem er seine eigenen Ersetzungen vorgenommen hat.:
, 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 mithello.c
und ohne Make - Datei, womake hello
compilierthello.c
zuhello
, fand ichmake CC=: hello
verhielt sich nach dem , was Sie sagen.:
nicht. Es/bin/true
ist wahrscheinlich der beste Weg, dies explizit zu tun.Obwohl ich damit einverstanden bin, dass die Verwendung des vollständigen Pfads
true
die 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: einenecho
davor zu halten. So:quelle
TOOL
sonst tun würde. Ohne-s
oder gleichwertig werdenmake
redundante Informationen ausgegeben , da beidemake
und derecho
vonmake
separat ausgeführte Befehl eine Ausgabe ausgeben. Wenn ich zum Beispielmake CC=echo hello
in einem Verzeichnishello.c
ohne Makefile laufe , erhalte ichecho hello.c -o hello
als erste Ausgabezeile undhello.c -o hello
als zweite. Aber einige Builds verwenden (oder der Benutzer kann hinzufügen)-s
, und dann ist es hilfreich.make -s CC=echo hello
gibt nurhello.c -o hello
.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:
quelle
Erstellen Sie im Arbeitsverzeichnis einen symbolischen Link zu / bin / true mit dem Namen so etwas wie
skip
. Somit...Dann kann die make line sein ...
quelle
Hier ist eine Möglichkeit, dies mit etwas mehr Zeichen zu tun:
Nachdem Sie es einmal getan haben, können Sie es einfach unter Verwendung des Namens erneut ausführen
T
.quelle