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

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.


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

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

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 &>-

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


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 :) "


2
Interessante corte ... upvoting para esperteza ^ _ ^
skplunkerin

4

Tente com:

myprogram &>/dev/null

para não obter saída


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


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 &

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.