19Aug

Come si esegue un comando in background senza uscita a meno che non ci sia un errore?

Se sei una persona impegnata, l'ultima cosa di cui hai bisogno è essere infastidita da una quantità enorme di notifiche "inutili", quindi come fai a calmare le cose? Il post di Q & A di SuperUser di oggi ha alcune ottime risposte per aiutare un lettore a ridurre la quantità di output.

Today's Question &La sessione di risposta ci viene fornita per gentile concessione di SuperUser, una suddivisione di Stack Exchange, un raggruppamento di Q & A basato su community.

La domanda

SuperUser reader Xster vuole sapere come eseguire un comando in background senza output a meno che non ci sia un errore:

Come si sopprime l'output di un comando, ma mostrarlo se l'uscita del comando codifica un errore?

Come si ottiene un comando da eseguire in background senza output a meno che non si verifichi un errore?

The Answer

I collaboratori di SuperUser Bob e Maximillian Laumeister hanno la risposta per noi. Innanzitutto, Bob:

Sfortunatamente, l'ipotesi che stderr sia utilizzata solo per l'output degli errori non è sempre corretta. Piuttosto,

stderr viene spesso utilizzato per qualsiasi output interattivo e diagnostica( ad esempio, l'output destinato all'utente a leggere in un prompt interattivo).( 1) wget e dd sono esempi noti.

Alcuni comandi forniscono un flag( ad esempio -quiet o -silent ) per sopprimere l'output senza errori. Leggi le loro pagine man per vedere se ne esiste una.

Un'altra convenzione che contiene più spesso è il codice di uscita , un programma restituisce un codice di uscita quando esce. Tipicamente ( 2) , un codice di uscita di 0 indica successo e qualsiasi altro codice di uscita indica un errore.

Con bash , è possibile ottenere il codice di uscita dell'ultimo comando da $?Variabile .In pesce , utilizzare la variabile di stato $.È possibile reindirizzare stderr su un file temporaneo e stamparlo solo se si verifica un errore. Ad esempio( fish ):

È anche possibile utilizzare alcune scorciatoie se non si eseguono i comandi concatenati:

Oppure:

È anche possibile reindirizzare stdout allo stesso buffer utilizzando 2 & gt; & 1 & gt; outputbuffer .

( Nota: In realtà non conosco fish , quindi sto adattando il concetto a ciò che posso trovare nella sua documentazione. La sintassi potrebbe essere leggermente errata. Inoltre, è possibile utilizzare mktemp per generare un temporaneo univocoEsegui e registra il nome del file in una variabile.)

Se hai bisogno di eseguire l'intera cosa sullo sfondo di una shell che stai usando anche in modo interattivo allo stesso tempo, allora è meglio scrivere uno script per gestirel'output, nascondendo ed eseguendo quello script in background con le tecniche standard( fish ).Diamine, puoi mettere qualcosa come la seguente funzione in ~ /.config/fish/ config.fish :

Chiama con somecommand run-silent &( in cui il trailing e ne causa l'esecuzione in background)

Si noti che questo ingoierà il codice di uscita originale e scaricherà stdout e stderr in caso di errore. Puoi personalizzarlo se necessario.

( 1) Non è garantito che l'output dell'errore non venga visualizzato su stdout , alcuni programmi eseguiranno il dump di tutti gli output lì!

( 2) Sfortunatamente, questo non è sempre il caso. Il codice di uscita è completamente controllato dal programma e alcuni indicano alcune condizioni di successo con uscite diverse da zero. Di nuovo, controlla il manuale.

Seguito dalla risposta di Maximillian Laumeister: Le utility Unix

inviano messaggi generali a stdout e messaggi di errore a stderr , quindi se vogliamo vedere solo i messaggi di errore, sarà sufficiente sopprimere stdout in modo chesolo stderr viene inviato alla console.

Il modo per farlo( in bash e fish ) è aggiungere & gt;/dev/ null al comando. Questo pipe stdout nel nulla, ma stderr ( con i messaggi di errore) viene ancora attraverso la console.

Quindi, ad esempio:

Il comando echo 1 & gt;/dev/ null non stampa nulla, poiché il normale output di stdout è soppresso e non è stato scritto nulla su stderr .

Il comando man doesnotexist & gt;/dev/ null stampa un messaggio di errore, poiché man scrive il suo messaggio di errore su stderr .

Hai qualcosa da aggiungere alla spiegazione? Audio disattivato nei commenti. Vuoi leggere più risposte dagli altri utenti di Stack Exchange esperti di tecnologia? Controlla la discussione completa qui.