Come silenziare l'output in uno script Bash?


149

Ho un programma che emette su stdout e vorrei mettere a tacere quell'output in uno script Bash mentre esegui il piping su un file.

Ad esempio, l'esecuzione del programma produrrà:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

Voglio che il seguente script non generi alcun output sul terminale:

#!/bin/bash
myprogram > sample.s

Da quello che ricordo, il reindirizzamento dell'output su un file fa sì che non venga ripetuto sul terminale. Cosa non funziona per te?
Anon.


Risposte:


187

Se esce anche su stderr, ti consigliamo di zittirlo. Puoi farlo reindirizzando il descrittore di file 2:

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null

15
La riga "&>" è una versione più breve di ciò che ho appena pubblicato. Non ho mai trovato quella scorciatoia prima. Upvoting.
Chradcliffe,

5
&>è molto più vecchio di bash 4.
Ignacio Vazquez-Abrams,

@ IgnacioVazquez-Abrams Puoi forse collegare l' &>introduzione alla documentazione del log delle modifiche ? : o
ThorSummoner,

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 indica che è >>&stato introdotto in 4.0. Non si fa menzione, &>ma i CAMBIAMENTI risalgono solo alla 2.0, quindi penso che ciò significhi che era già in 1.x.
tripleee

git blamesu redir.cun impegno del 1998 per la ricorrenza più vecchia ancora nella base di codice attuale.
Tripleee,

60

Reindirizza stderr a stdout

Questo reindirizzerà lo stderr (che è il descrittore 2) al descrittore di file 1 che è lo stdout.

2>&1

Reindirizza stdout su file

Ora quando esegui questa operazione stai reindirizzando lo stdout al file sample.s

myprogram > sample.s

Reindirizza stderr e stdout su File

La combinazione dei due comandi comporterà il reindirizzamento di sia stderr che stdout a sample.s

myprogram > sample.s 2>&1

Reindirizzare stderr e stdout su / dev / null

Reindirizzare a /dev/nullse si desidera disattivare completamente l'applicazione.

myprogram >/dev/null 2>&1

13
L'ultimo manca un operatore di reindirizzamento; dovrebbe essere myprogram >/dev/null 2>&1(notare il cuneo prima /dev/nulle l'ordine dei reindirizzamenti).
tripleee,

2
non myprogram &>/dev/nullsarebbe abbastanza?
JaviOverflow,

38

Tutto l'output:

scriptname &>/dev/null

Portatile:

scriptname >/dev/null 2>&1

Portatile:

scriptname >/dev/null 2>/dev/null

Per bash più recenti (non portatili):

scriptname &>-

Questo non funziona In realtà crea un file denominato -ed &>è un'estensione della shell bourne non portatile.
PhilT

L'equivalente portatile echo moo 1>&-produce un errore perché il descrittore di file 1 è chiuso:-bash: echo: write error: Bad file descriptor
tripleee

11

Se vuoi STDOUT e STDERR entrambi [tutto], il modo più semplice è:

#!/bin/bash
myprogram >& sample.s

quindi eseguilo come ./script, e non otterrai alcun output sul tuo terminale. :)

"> &" significa STDERR e STDOUT. la &funziona anche nello stesso modo con un tubo: ./script |& sed che invierà tutto a sed


7
man bash (sotto "Reindirizzamento dell'output standard e dell'errore standard") dice che &> e> & sono equivalenti ma il primo (&>) è preferito. Tuttavia | & è l'unico modo per farlo per i tubi.
John Mellor,

1
@Giovanni No, il modo portatile per le pipe èa 2>&1 | b 2>&1 | c
tripleee

9

Se hai ancora difficoltà a trovare una risposta, specialmente se hai prodotto un file per l'output e preferisci una chiara alternativa: echo "hi" | grep "use this hack to hide the oputut :) "


2
Interessante hack ... voto per intelligenza ^ _ ^
skplunkerin

4

Prova con:

myprogram &>/dev/null

per non ottenere output


0

Nota: questa risposta è correlata alla domanda "Come disattivare l'eco durante l'esecuzione di uno script di shell Linux" che è stato a sua volta contrassegnato come duplicato a questo.

Per disattivare effettivamente l'eco il comando è:

stty -echo

(questo è, ad esempio; quando vuoi inserire una password e non vuoi che sia leggibile. Ricorda di attivare l'eco alla fine dello script, altrimenti la persona che esegue lo script non vedrà ciò che / digita da allora in poi. Per attivare l'eco in esecuzione:

eco stty


0

Utile negli script:


Ottieni solo lo STDERR in un file, mentre nascondi qualsiasi STDOUT anche se il programma da nascondere non esiste affatto (non si blocca mai lo script principale), questo da solo funzionava:

stty -echo && ./programMightNotExist 2> errors.log && stty echo

Stacca completamente e metti in silenzio tutto, anche uccidere lo script genitore non si interromperà ./prog:

 ./prog </dev/null >/dev/null 2>&1 &

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.