Comando che esce con stato zero (non / bin / true)?


11

Ho un Makefile che esegue uno strumento che richiede un po 'di tempo; mi permette di sostituire il comando usato:

make TOOL=alternative-tool

Vorrei saltare questo passaggio nel Makefile, quindi sto cercando un comando che esca con lo stato 0 e che abbia effetti collaterali trascurabili.

Ovviamente, potrei semplicemente usare true, ma è un po 'confuso:

make TOOL=true

Sembra che io voglia eseguire lo strumento, ma non lo faccio.

Esiste un eseguibile installato per impostazione predefinita che non /bin/trueesce con lo stato 0 e che ha un nome accattivante e facile da digitare?


Commenti di supporto per Makefile, gnu.org/software/make/manual/html_node/Makefile-Contents.html . Inserisci un commento prima della riga e documenta il tuo codice. Ciò riduce la confusione e spiega perché hai usato un certo approccio.
Freiheit,

1
Quale linea? Il TOOL=truesarà sulla linea di comando quando si richiama marca, probabilmente documentato in un file README nelle vicinanze. La riga effettiva che richiama lo strumento è da qualche parte all'interno di un makefile di 7000 righe (di terze parti).
Roger Lipscombe,

Risposte:


42

Anche se hai chiesto qualcosa che "non /bin/true", sostituire truecon il nome completo /bin/trueper mostrare che è il trueprogramma piuttosto che qualche altro significato di "vero" è probabilmente la soluzione migliore.

La tua preoccupazione è che l' truein

make TOOL=true

sembra essere qualcosa di diverso da un nome di comando. Ma se scrivi

make TOOL=/bin/true

allora questo è inequivocabilmente un comando. Qualcuno potrebbe interpretare erroneamente il TOOL=truesignificato di qualche altro strumento da qualche parte, ma TOOL=/bin/trueè probabile che tale interpretazione non sia corretta .


Non sono sicuro di quando :, che è una shell incorporata ma non un comando esterno, funzionerà. Henning Makholm ha riferito che sembra funzionare . Ma penso che non funzioni in tutte le situazioni e hai scoperto che non ha funzionato per te .

Per quanto riguarda un alias di shell, non è possibile utilizzarlo perché l'espansione dell'alias non viene eseguita negli argomenti passati a un comando, né i makefile fanno alcun uso degli alias di shell definiti in precedenza. Anche se makeesegue i tuoi comandi in una nuova shell, quella shell non avrà l'alias (e non la userebbe anche se ce l'avesse, perché sarebbe una shell non interattiva, in cui l'espansione dell'alias non è abilitata automaticamente).


1
L'uso :sembra funzionare bene per me. makegenera sempre una shell per eseguire ciascun comando dopo aver effettuato le proprie sostituzioni.
Hmakholm lasciò Monica il

@HenningMakholm Grazie, ho modificato. Potresti voler inviare una risposta. Lok Lam Cheng ha commentato la domanda da suggerire :, ma dovrebbe essere una risposta (soprattutto se corretta) e quel commento non spiega perché ci si dovrebbe aspettare che funzioni. In una directory con hello.ce senza makefile, dove make hellocompilazioni hello.ca hello, ho trovato make CC=: hellocomportata in base a ciò che stai dicendo.
Eliah Kagan,

2
Sfortunatamente, per questo particolare Makefile (usa erlang.mk ), l'utilizzo :non funziona. Essere espliciti /bin/trueè probabilmente il modo migliore per farlo.
Roger Lipscombe,

7

Anche se concordo sul fatto che utilizzare il percorso completo per truesarebbe la soluzione migliore, vorrei notare quale è probabilmente il modo di gran lunga più comune per evitare la reale esecuzione dei comandi: restare echodavanti. Così:

make TOOL=echo

Penso che a volte sia utile quando è importante ricordare che si sopprime qualunque azione TOOLaltrimenti farebbe. Senza -so equivalente, makeemette informazioni ridondanti, poiché entrambi makee il echocomando eseguito makeseparatamente emettono output. Ad esempio, quando corro make CC=echo helloin una directory con hello.ce senza makefile, ottengo echo hello.c -o hellocome prima riga di output e hello.c -o hellocome seconda. Ma alcune build usano (o l'utente può aggiungere) -s, e quindi è utile. make -s CC=echo hellodà solo hello.c -o hello.
Eliah Kagan,

(che potrebbe comunque essere utile se i comandi coinvolgono espansioni della shell, quindi puoi avere un'idea più chiara di ciò che viene eseguito, se interessato)
muru

5

Puoi sempre eseguire il tuo comando che non fa altro che restituire uno stato di uscita pari a zero. Alcune opzioni:

  • un collegamento simbolico con un nome appropriato /bin/true

  • uno script di shell vuoto

  • un programma C quasi vuoto:

    int main() {
        return 0;
    }

Un buon nome per un tale programma sarebbe noop o no-op.
ARP

0

Creare un collegamento simbolico nella directory di lavoro a / bin / true con un nome simile skip. Così ...

skip -> /bin/true

Quindi la linea di creazione può essere ...

make TOOL=./skip

-2

Ecco un modo per farlo con leggermente più personaggi:

function T() { /bin/true; }

Dopo averlo fatto una volta, puoi rieseguirlo semplicemente usando il nome T.

false; T; echo $?

3
Potresti spiegare come questa funzione può essere invocata da un valore di variabile Make (da utilizzare nella situazione in questione)?
David Foerster,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.