Como posso suprimir toda a saída de um comando usando o Bash?

296

Eu tenho um script Bash que executa um programa com parâmetros. Esse programa gera algum status (fazendo isso, fazendo aquilo ...). Não há nenhuma opção para este programa ficar quieto. Como impedir que o script exiba alguma coisa?

Estou procurando algo como "eco off" do Windows .

6bytes
fonte

Respostas:

510

A seguir, a saída padrão é enviada para o dispositivo nulo (bit bucket).

scriptname >/dev/null

E se você também quiser que as mensagens de erro sejam enviadas para lá, use uma das (a primeira pode não funcionar em todas as conchas):

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

E, se você deseja gravar as mensagens, mas não vê-las, substitua /dev/nullpor um arquivo real, como:

scriptname &>scriptname.out

Para ser completo, no Windows cmd.exe (onde "nul" é o equivalente a "/ dev / null"), é:

scriptname >nul 2>nul
andynormancx
fonte
8
Observe que '&>' é peculiar ao bash (e talvez conchas em C); Os shells Korn e Bourne requerem 2> / dev / null ou 2> & 1 (para enviar stderr para o mesmo local que stdout). O shell do Korn parece interpretar '&>' como "executar o material até & em segundo plano, depois faça o redirecionamento de E / S em um comando vazio".
31416 Jonathan Leffler
2
Observe que alguns comandos gravam diretamente no dispositivo terminal, e não na saída / erro padrão. Para testar, insira echo foo > $(tty)um script e execute ./test.sh &> /dev/null- A saída ainda é impressa no terminal. É claro que isso não é um problema se você estiver escrevendo um script que não utiliza esses comandos.
L0b0
1
@ l0b0, existe uma maneira de diferenciar o tty do script (ou de qualquer outro programa) para que toda a saída seja redirecionada independentemente do seu exemplo? Eu sei que tela e script podem fazer algo assim, mas ambos são exigentes e variam de * nix a * nix.
Brent
@yang /dev/nullexiste no Cygwin, você não precisa usar nul.
precisa saber é o seguinte
47

Algo como

script > /dev/null 2>&1

Isso impedirá a saída padrão e a saída de erro, redirecionando os dois para /dev/null.

Diego Sevilla
fonte
5
Também alcançado com apenas &> se você quiser economizar algum digitação;)
andynormancx
1
Embora eu esteja adicionando isso ao meu comando gs (GhostScript), ele ainda imprime **** Atenção: O arquivo tem um marcador %% EOF corrompido ou lixo após %% EOF. Algum conselho?
ZurabWeb
Isso não executa o processo em sistemas unix, eu tive que fazer2>/dev/null
sempre
13

Experimentar

: $(yourcommand)

: é a abreviação de "não faça nada".

$() é apenas seu comando.

V0idSt4r
fonte
3
Muito interessante, mas há uma limitação: o código de status retornado é sempre 0(sucesso). Vamos ver um exemplo usando o comando falseque sempre retorna 1(falha). Por exemplo, ( echo foo | tee file ; false ) && echo barexibe foo. Usando o seu truque para suprimir a saída: ( : $(echo foo | tee file ; false) ) && echo bar. Mas é exibido o barsignificado do código de status de retorno 0(este não é o código de status retornado false). Atualize sua resposta, fornecendo esta limitação. Cheers
olibre 5/11
2
@olibre, que tal DUMMY=$(yourcommand)? Não tem a limitação que você mencionou. :)
semente 14/03
3
@ perfeito: O comando DUMMY=$( echo foo | tee file ; false ) && echo barnão exibe nada. E o comando é DUMMY=$( echo foo | tee file ; true ) && echo barexibido bar. Deixe-me saber se você fornecer uma resposta para voto-lo ;-) Cheers
olibre 16/16
9

Uma alternativa que pode caber em algumas situações é atribuir o resultado de um comando a uma variável:

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

Como o Bash e outros intérpretes de linha de comando POSIX não consideram as atribuições de variáveis ​​como um comando, o código de retorno do comando atual é respeitado.

Nota: a atribuição com a palavra-chave typesetou declareé considerada como um comando; portanto, o código de retorno avaliado no caso é a própria atribuição e não o comando executado no sub-shell:

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

Como o post de andynormancx , use este (se você estiver trabalhando em um ambiente Unix):

scriptname > /dev/null

Ou você pode usar isso (se estiver trabalhando em um ambiente Windows):

scriptname > nul
Lucas Gabriel Sánchez
fonte
1
Você pode realmente fazer melhor que isso no shell do Windows. Se, em vez disso, você usar "scriptname> nul", não precisará nem mesmo excluir um arquivo, pois "nul" é o equivalente do Windows a / dev / null.
andynormancx
1
@andynormancx: Isso é o que eu odeio no layout do sistema de arquivos do Windows. Ele "reserva" nomes de arquivos como NUL, COM1, LPT1, CON, etc, não importa em que diretório você esteja (mesmo se você estiver em um sistema de arquivos que possa ter esses nomes, como em compartilhamentos de rede).
Dreamlax #
Eu não acho que eu realmente utilizados NUL desde 5.x DOS, teve um súbito lampejo de lembrança quando vi esta resposta;)
andynormancx
Caso você tenha usado > nulno Windows com cygwin ou git bash e agora esteja preso a um nularquivo que não pode ser excluído, tente esta resposta , pois funcionou como um encanto.
Daemon Painter
4

Dê uma olhada neste exemplo do The Linux Documentation Project :

3.6 Amostra: arquivo stderr e stdout 2

Isso colocará todas as saídas de um programa em um arquivo. Às vezes, isso é adequado para entradas cron, se você deseja que um comando seja transmitido em silêncio absoluto.

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

Dito isto, você pode usar este redirecionamento simples:

/path/to/command &>/dev/null
ivanleoncz
fonte
1

No seu script, você pode adicionar o seguinte às linhas que você sabe que fornecerão uma saída:

some_code 2>>/dev/null

Ou então você também pode tentar

some_code >>/dev/null
Rohan Dsouza
fonte
1
nunca vi >> para / dev / null .. por curiosidade .. Por que você está fazendo isso?
Florian Berndl
Está suprimindo toda a saída?
Peter Mortensen
Por que o duplo ">" ( >>)?
Peter Mortensen