Como silenciar a saída em um script Bash?

149

Eu tenho um programa que gera saída para stdout e gostaria de silenciar essa saída em um script Bash ao canalizar para um arquivo.

Por exemplo, a execução do programa produzirá:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

Eu quero que o seguinte script não produza nada no terminal:

#!/bin/bash
myprogram > sample.s
Sam
fonte
Pelo que me lembro, redirecionar a saída para um arquivo faz com que ele não seja ecoado no terminal. O que não está funcionando para você?
Anon.
serverfault.com/questions/41964/…
Ciro Santilli escreveu
Possível duplicata de Como suprimir toda a saída de um comando usando o Bash?
Ulrich Eckhardt

Respostas:

187

Se o resultado for stderr, você precisará silenciar isso. Você pode fazer isso redirecionando o descritor de arquivo 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
John Kugelman
fonte
15
A linha "&>" é uma versão mais curta do que acabei de publicar. Eu nunca encontrei esse atalho antes. Voto a favor.
chradcliffe
5
&>é muito mais antigo que o bash 4.
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams Você pode vincular a &>introdução da documentação do changelog ? : o
ThorSummoner
1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 indica que >>&foi introduzido na 4.0. Não há menção, &>mas as MUDANÇAS voltam para a versão 2.0, então eu acho que isso significa que já estava na 1.x.
tripleee
git blameon redir.caponta para um commit de 1998 para a ocorrência mais antiga ainda na base de código atual.
tripleee
60

Redirecionar stderr para stdout

Isso redirecionará o stderr (que é o descritor 2) para o descritor de arquivo 1, que é o stdout.

2>&1

Redirecionar stdout para arquivo

Agora, ao fazer isso, você está redirecionando o stdout para o arquivo sample.s

myprogram > sample.s

Redirecionar stderr e stdout para Arquivo

A combinação dos dois comandos resultará no redirecionamento de stderr e stdout para sample.s

myprogram > sample.s 2>&1

Redirecionar stderr e stdout para / dev / null

Redirecione para /dev/nullse você deseja silenciar completamente seu aplicativo.

myprogram >/dev/null 2>&1
Depurador
fonte
13
O último está faltando um operador de redirecionamento; deve ser myprogram >/dev/null 2>&1(observe a cunha antes /dev/nulle a ordem dos redirecionamentos).
tripleee
2
não myprogram &>/dev/nullseria suficiente?
JaviOverflow 6/09/19
38

Toda saída:

scriptname &>/dev/null

Portátil:

scriptname >/dev/null 2>&1

Portátil:

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

Para o bash mais recente (não portátil):

scriptname &>-
Eduardo Cuomo
fonte
Isso não funciona. Na verdade, ele cria um arquivo chamado -e &>é uma extensão de shell bourne não portátil.
PhilT
O equivalente portátil echo moo 1>&-produz um erro porque o descritor de arquivo 1 está fechado:-bash: echo: write error: Bad file descriptor
tripleee 30/06
11

Se você quer STDOUT e STDERR ambos [tudo], a maneira mais simples é:

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

em seguida, execute-o como ./scriptvocê não obterá saída para o seu terminal. :)

o "> &" significa STDERR e STDOUT. o &também funciona da mesma maneira com um tubo: ./script |& sed que irá enviar tudo para sed

Matt
fonte
7
O man bash (em "Redirecionando saída padrão e erro padrão") diz que &> e> & são equivalentes, mas o primeiro (&>) é o preferido. No entanto, | & é a única maneira de fazer isso para tubos.
John Mellor
1
@ John Não, o caminho portátil para tubos é #a 2>&1 | b 2>&1 | c
tripleee
9

Se você ainda está lutando para encontrar uma resposta, especialmente se você produziu um arquivo para a saída e prefere uma alternativa clara: echo "hi" | grep "use this hack to hide the oputut :) "

Henry H.
fonte
2
Interessante corte ... upvoting para esperteza ^ _ ^
skplunkerin
4

Tente com:

myprogram &>/dev/null

para não obter saída

Swathi
fonte
0

Nota: Esta resposta está relacionada à pergunta "Como desativar o eco durante a execução de um shell script Linux", que por sua vez foi marcado como duplicado para este.

Para realmente desativar o eco, o comando é:

stty -echo

(isto é, por exemplo; quando você deseja inserir uma senha e não deseja que seja legível. Lembre-se de ativar o eco no final do seu script, caso contrário, a pessoa que executa o script não verá o que ele Ela digita a partir de então.Para ativar o eco, execute:

eco stty

Berni
fonte
0

Útil em scripts:


Obtenha apenas o STDERR em um arquivo, enquanto oculta qualquer STDOUT, mesmo que o programa a ocultar não exista (nunca interrompe o script pai), apenas isso funcionava:

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

Desanexe completamente e silencie tudo, até matar o script pai não abortará ./prog:

 ./prog </dev/null >/dev/null 2>&1 &
NVRM
fonte
0

Para saída apenas com erro :

então [comando]

Logotipo

Alberto Salvia Novella
fonte