Come posso eliminare tutto l'output di un comando usando Bash?


296

Ho uno script Bash che esegue un programma con parametri. Quel programma emette un certo stato (facendo questo, facendo quello ...). Non c'è alcuna opzione per questo programma di essere silenzioso. Come posso impedire che lo script visualizzi qualcosa?

Sto cercando qualcosa come "echo off" di Windows .

Risposte:


510

Di seguito viene inviato l'output standard al dispositivo null (bucket bit).

scriptname >/dev/null

E se vuoi anche inviare messaggi di errore lì, usa uno dei (il primo potrebbe non funzionare in tutte le shell):

scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null

E, se si desidera registrare i messaggi, ma non visualizzarli, sostituirli /dev/nullcon un file effettivo, ad esempio:

scriptname &>scriptname.out

Per completezza, in Windows cmd.exe (dove "nul" è l'equivalente di "/ dev / null"), è:

scriptname >nul 2>nul

8
Nota che '&>' è peculiare di bash (e forse delle shell C); Le shell Korn e Bourne richiedono 2> / dev / null o 2> & 1 (per inviare stderr nello stesso posto di stdout). La shell Korn sembra interpretare "&>" come "esegui le cose su e in background, quindi esegui il reindirizzamento degli I / O su un comando vuoto".
Jonathan Leffler,

2
Si noti che alcuni comandi scrivono direttamente sul dispositivo terminale anziché sull'output / errore standard. Per testare, inserire echo foo > $(tty)uno script ed eseguire ./test.sh &> /dev/null: l'output viene comunque stampato sul terminale. Naturalmente questo non è un problema se stai scrivendo uno script che non utilizza tali comandi.
10

1
@ l0b0, c'è un modo per rendere diversa la tty dello script (o di qualsiasi altro programma) in modo che tutto l'output venga reindirizzato indipendentemente dal tuo esempio? So che schermo e sceneggiatura possono fare qualcosa del genere, ma entrambi sono pignoli e variano da * nix a * nix.
Brent,

@yang /dev/nullesiste in Cygwin, non è necessario utilizzarlo nul.
dimo414,

47

Qualcosa di simile a

script > /dev/null 2>&1

Ciò impedirà l'output standard e l' output di errore, reindirizzandoli entrambi a /dev/null.



1
Anche se lo sto aggiungendo al mio comando gs (GhostScript), viene comunque stampato **** Avviso: il file ha un marcatore %% EOF corrotto o immondizia dopo %% EOF. Qualche consiglio?
ZurabWeb,

Questo non viene eseguito il processo sui sistemi UNIX, ho dovuto fare2>/dev/null
Alper

13

Provare

: $(yourcommand)

: è l'abbreviazione di "non fare nulla".

$() è solo un tuo comando.


3
Molto interessante ma c'è un limite: il codice di stato restituito è sempre 0(successo). Vediamo un esempio usando il comando falseche restituisce sempre 1(errore). Ad esempio ( echo foo | tee file ; false ) && echo bardisplay foo. Utilizzando il trucco per sopprimere l'output: ( : $(echo foo | tee file ; false) ) && echo bar. Ma indica barche il codice di stato di ritorno è 0(questo non è il codice di stato restituito da false). Aggiorna la tua risposta fornendo questa limitazione. Cin cin
olibre,

2
@olibre, che dire DUMMY=$(yourcommand)? Non ha le limitazioni che hai citato. :)
semente

3
@semente Perfetto: il comando DUMMY=$( echo foo | tee file ; false ) && echo barnon visualizza nulla. E DUMMY=$( echo foo | tee file ; true ) && echo barviene visualizzato il comando bar. Fammi sapere se fornisci una risposta per votarla ;-) Saluti
olibre

9

Un'alternativa che può adattarsi in alcune situazioni è quella di assegnare il risultato di un comando a una variabile:

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

Poiché Bash e altri interpreti della riga di comando POSIX non considerano le assegnazioni di variabili come un comando, il codice di ritorno del comando corrente viene rispettato.

Nota: l' assegnazione con la parola chiave typeseto declareè considerata come un comando, quindi il codice di ritorno valutato nel caso sia l'assegnazione stessa e non il comando eseguito nella sotto-shell:

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0

6

Come il post di andynormancx , usa questo (se lavori in un ambiente Unix):

scriptname > /dev/null

Oppure puoi usare questo (se lavori in un ambiente Windows):

scriptname > nul

1
In realtà puoi fare di meglio nella shell di Windows. Se invece usi "scriptname> nul", non avrai nemmeno un file da eliminare, poiché "nul" è l'equivalente di Windows di / dev / null.
andynormancx

1
@andynormancx: Questo è ciò che odio del layout del file system di Windows. "Riserva" nomi di file come NUL, COM1, LPT1, CON, ecc., Indipendentemente dalla directory in cui ci si trova (anche se ci si trova in un file system che può avere quei nomi di file, come nelle condivisioni di rete).
dreamlax,

Non credo di aver effettivamente utilizzato NUL dal DOS 5.x, ho avuto un improvviso lampo di ricordo quando ho visto questa risposta;)
andynormancx

Nel caso in cui tu abbia usato > nulsu Windows con Cygwin o Git Bash e ora sei bloccato con un nulfile che non può essere cancellato, prova a questa risposta , ha funzionato come un fascino.
Daemon Painter il

4

Dai un'occhiata a questo esempio da The Linux Documentation Project :

3.6 Esempio: file stderr e stdout 2

Ciò inserirà ogni output di un programma in un file. Questo è adatto a volte per le voci cron, se si desidera che un comando passi in assoluto silenzio.

     rm -f $(find / -name core) &> /dev/null 

Detto questo, puoi usare questo semplice reindirizzamento:

/path/to/command &>/dev/null

1

Nel tuo script puoi aggiungere quanto segue alle righe che sai che daranno un output:

some_code 2>>/dev/null

Oppure puoi anche provare

some_code >>/dev/null

1
mai visto >> a / dev / null .. per curiosità .. Perché lo stai facendo?
Florian Berndl,

Sopprime tutto l'output?
Peter Mortensen,

Perché il doppio ">" ( >>)?
Peter Mortensen,
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.