Come si esegue un comando sullo sfondo senza uscita a meno che non vi sia un errore?
Se sei una persona impegnata, allora l'ultima cosa di cui hai bisogno è di essere disturbata 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.
La sessione di domande e risposte di oggi ci viene fornita per gentile concessione di SuperUser, una suddivisione di Stack Exchange, un raggruppamento di siti Web di domande e risposte basato sulla comunità.
La domanda
Lettore SuperUser 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 ci sia un errore?
La risposta
Collaboratori SuperUser Bob e Maximillian Laumeister hanno la risposta per noi. Per prima cosa, Bob:
Sfortunatamente, l'ipotesi che stderr è usato solo per l'output di errore non è sempre corretto. 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 ben noti.
Alcuni comandi forniranno una bandiera (ad es. -silenzioso o -silenzioso) per sopprimere l'output non errore. 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, puoi ottenere il codice di uscita dell'ultimo comando da $? variabile. Nel pesce, utilizzare il $ stato variabile. Puoi pipe stderr in un file temporaneo e stamparlo solo se si verifica un errore. Per esempio (pesce):
Puoi anche utilizzare alcune scorciatoie se non stai concatenando i comandi:
O:
Puoi anche pipe stdout allo stesso buffer usando 2> & 1> / tmp / outputbuffer.
(Nota: In realtà non lo so pesce, quindi sto adattando il concetto a ciò che posso trovare nella sua documentazione. La sintassi potrebbe essere leggermente errata. Inoltre, puoi usare mktemp per generare un file temporaneo univoco. Eseguilo e registra il nome del file in una variabile.)
Se hai bisogno di eseguire l'intera cosa sullo sfondo di una shell che stai utilizzando anche in modo interattivo allo stesso tempo, allora è meglio scrivere uno script per gestire l'output-nascondere e far girare quello script in background con le tecniche standard (pesce). Diamine, puoi inserire qualcosa come la seguente funzione in ~ / .Config / pesce / config.fish:
Chiama con run-silent somecommand & (dove il finale & lo fa funzionare in background)
Nota che questo ingerirà il codice di uscita originale e scaricherà entrambi stdout e stderr in caso di fallimento. Puoi personalizzarlo se necessario.
(1) Non è garantito che l'output dell'errore non venga visualizzato stdout, alcuni programmi scaricheranno tutto l'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 utilità Unix inviano messaggi generali a stdout, e messaggi di errore a stderr, quindi se vogliamo solo vedere i messaggi di errore, allora sarà sufficiente sopprimere stdout così solo stderr ottiene l'output sulla console.
Il modo per farlo (in entrambi bash e pesce) è da aggiungere > / Dev / null al comando. Questo tubi stdout nel nulla, ma stderr (con i tuoi messaggi di errore) arriva ancora attraverso la console.
Quindi per esempio:
Il comando echo 1> / dev / null stampa nulla, perché il normale stdout l'output è soppresso e non è stato scritto nulla stderr.
Il comando man doesnotexist> / dev / null stampa un messaggio di errore, perché uomo scrive il suo messaggio di errore a 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.