Risposte:
Sfortunatamente, il presupposto che stderr
viene utilizzato solo per l'output degli errori non è sempre corretto. Piuttosto, stderr
viene spesso utilizzato per qualsiasi output interattivo e diagnostica, ovvero output destinato all'utente a leggere in un prompt interattivo 1 . wget
edd
sono esempi ben noti.
Alcuni comandi forniranno un flag (ad es. -quiet
O -silent
) per sopprimere l'output senza errori - leggi le loro pagine man per vedere se ne esiste uno.
Un'altra convenzione che vale più spesso è il codice di uscita : un programma restituisce un codice di uscita quando esce. In genere 2 , un codice di uscita di0
indica successo, e qualsiasi altro codice di uscita indica un errore.
Con bash
, è possibile ottenere il codice di uscita dell'ultimo comando dalla $?
variabile. In fish
, usa la $status
variabile. È possibile reindirizzare stderr
a un file temporaneo e stamparlo solo se si verifica un errore. Ad esempio ( fish
):
command 2>/tmp/outputbuffer
if $status
cat /tmp/outputbuffer
rm /tmp/outputbuffer
Puoi anche usare alcune scorciatoie, se non stai concatenando i comandi:
if command 2>/tmp/outputbuffer
cat /tmp/outputbuffer
rm /tmp/outputbuffer
O:
command 2>/tmp/outputbuffer; or cat /tmp/outputbuffer; rm /tmp/outputbuffer;
È inoltre possibile reindirizzare stdout
allo stesso buffer utilizzando 2>&1 >/tmp/outputbuffer
.
(Nota: in realtà non lo so fish
, quindi sto adattando il concetto a ciò che posso trovare nella sua documentazione. La sintassi potrebbe essere leggermente sbagliata. Inoltre, è possibile utilizzare mktemp
per generare un file temporaneo univoco: eseguirlo e registrare il nome file in una variabile.)
Se hai bisogno di eseguire tutto sullo sfondo di una shell che stai anche usando in modo interattivo allo stesso tempo, allora è meglio scrivere uno script per gestire l'output-hiding ed eseguire quello script in background con le tecniche standard ( fish
). Diamine, puoi inserire qualcosa come la seguente funzione in ~/.config/fish/config.fish
:
function run-silent
set temp (mktemp)
if $argv 2>&1 >$temp
cat $temp
rm $temp
end
Chiama con run-silent somecommand &
(dove il trailing lo &
fa funzionare in background)
Si noti che ciò inghiottirà il codice di uscita originale e scaricherà entrambi stdout
e stderr
in caso di errore. Puoi personalizzarlo come necessario.
1 Non c'è nemmeno la garanzia che l'output dell'errore non appaia 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. Ancora una volta, controlla il manuale.
Le utility Unix inviano messaggi generali stdout
e messaggi di errore a stderr
, quindi se vogliamo vedere solo messaggi di errore, sarà sufficiente sopprimere stdout
solostderr
ottenere output sulla console.
Il modo per farlo (in entrambi bash
e fish
) è aggiungere>/dev/null
al comando. Questo pipe 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
non stampa nulla, perché il normalestdout
output è soppresso e nulla è stato scritto su stderr.
Il comando man doesnotexist >/dev/null
stampa un messaggio di errore, perché man
scrive il suo messaggio di errore in stderr
.