Sono confuso sul perché “| vero "in un makefile ha lo stesso effetto di" || vero"


13

Ho un makefile in cui sto interrompendo un servizio prima di rimuovere un file. Quando non è stato possibile interrompere il servizio, si interrompeva in caso di errore. Questo è chiaramente indesiderato, quindi ho pensato di aggiungere || truema ho perso un |. Realizzandolo:

stop service foo | true
rm /etc/init/foo.conf

Sono confuso sul perché questo funziona e cosa sta succedendo. Questo significa che trueè un'applicazione e non semplicemente una parola chiave? Sono gli stessi? C'è una buona ragione per usare | true?

Risposte:


16

truee falsesono coreutils (anche tipicamente shell incorporate) che restituiscono solo 0 e non-0, per le situazioni in cui ti capita di aver bisogno di quel comportamento. Dalle pagine man:

vero - non fare nulla, con successo
falso - non fare nulla, senza successo

Quindi stai eseguendo il piping dell'output da stop service fooin true, che lo ignora e restituisce 0. Tecnicamente funziona, ma probabilmente dovresti usarlo || truequindi è ovvio quale fosse la tua intenzione; non c'è davvero alcun motivo per reindirizzare l'output in un programma che non lo utilizza


4
Ha perfettamente senso. :) Non so perché ma leggendo "non fare nulla, senza successo". mi fa ridere.
Kit Sunde,

9
Un altro motivo da evitare | trueè che se il comando producesse un output sufficiente per riempire il buffer della pipe, si bloccherebbe in attesa truedi leggerlo.
cjm,

3
@cjm o muori a causa di SIGPIPE
Andy,

6
@Kit: Si noti che foo || truee foo | truenon fare la stessa cosa: foo || truemostrerà l'uscita dal foo, mentre foo | truesi scarta tutto ciò che fooscrive sul suo standard output (ed fooè probabile che morire con SIGPIPEo il blocco, come già indicato).
Gilles 'SO-smetti di essere malvagio' il

Questa risposta è perfetta, tranne per la parola "probabilmente" ...!
Sam Watkins,
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.