Como ocultar a saída do comando no Bash

99

Quero deixar meus scripts Bash mais elegantes para o usuário final. Como oculto a saída quando o Bash está executando comandos?

Por exemplo, quando o Bash executa

yum install nano

O seguinte será mostrado ao usuário que executou o Bash:

Loaded plugins: fastestmirror
base                                                     | 3.7 kB     00:00
base/primary_db                                          | 4.4 MB     00:03
extras                                                   | 3.4 kB     00:00
extras/primary_db                                        |  18 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/primary_db                                       | 3.8 MB     00:02
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nano.x86_64 0:2.0.9-7.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch              Version                Repository       Size
================================================================================
Installing:
 nano            x86_64            2.0.9-7.el6            base            436 k

Transaction Summary
================================================================================
Install       1 Package(s)

Total download size: 436 k
Installed size: 1.5 M
Downloading Packages:
nano-2.0.9-7.el6.x86_64.rpm                              | 436 kB     00:00
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
 Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]>
 Package: centos-release-6-4.el6.centos.10.x86_64 (@anaconda-CentOS-201303020151.x86_64/6.4)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : nano-2.0.9-7.el6.x86_64                                      1/1
  Verifying  : nano-2.0.9-7.el6.x86_64                                      1/1

Installed:
  nano.x86_64 0:2.0.9-7.el6

Complete!

Agora quero ocultar isso do usuário e, em vez disso, mostrar:

    Installing nano ......

Como posso realizar essa tarefa? Definitivamente, ajudarei a tornar o script mais amigável. Caso ocorra um erro, ele deve ser mostrado ao usuário.

Gostaria de saber como mostrar a mesma mensagem enquanto um conjunto de comandos está sendo executado.

user2650277
fonte
4
echo "Installing nano ......"; yum install nano &> /dev/null
user000001
2
Consulte stackoverflow.com/questions/617182/…
Jaffar Ramay
Possível duplicata de Como suprimir todas as saídas de um comando usando Bash?
Ulrich Eckhardt

Respostas:

246

Usa isto.

{
  /your/first/command
  /your/second/command
} &> /dev/null

Explicação

Para eliminar a saída de comandos, você tem duas opções:

  • Feche o arquivo descritor de saída, que o impede de aceitar mais entradas. Isso se parece com isto:

    your_command "Is anybody listening?" >&-

    Normalmente, a saída vai para o descritor de arquivo 1 (stdout) ou 2 (stderr). Se você fechar um descritor de arquivo, terá que fazer isso para cada descritor numerado, pois &>(abaixo) é uma sintaxe BASH especial incompatível com >&-:

    /your/first/command >&- 2>&-

    Tome cuidado para observar a ordem: >&- fecha o stdout , que é o que você deseja fazer; &>-redireciona stdout e stderr para um arquivo denominado -(hífen), que não é o que você deseja fazer. A princípio parecerá o mesmo, mas o último cria um arquivo perdido em seu diretório de trabalho. É fácil de lembrar: >&2redireciona stdout para o descritor 2 (stderr), >&3redireciona stdout para o descritor 3 e >&-redireciona stdout para um beco sem saída (ou seja, fecha stdout).

    Observe também que alguns comandos podem não lidar com um descritor de arquivo fechado particularmente bem ("erro de gravação: descritor de arquivo inválido"), e é por isso que a melhor solução pode ser ...

  • Redirecione a saída para/dev/null , que aceita todas as saídas e não faz nada com elas. Se parece com isso:

    your_command "Hello?" > /dev/null

    Para redirecionar a saída para um arquivo, você pode direcionar stdout e stderr para o mesmo lugar de maneira muito concisa, mas apenas em bash:

    /your/first/command &> /dev/null

Finalmente, para fazer o mesmo para vários comandos de uma vez, coloque tudo entre chaves. O Bash trata isso como um grupo de comandos , agregando os descritores de arquivo de saída para que você possa redirecionar todos de uma vez. Se, em vez disso, estiver familiarizado com subshells usando ( command1; command2; )sintaxe, você descobrirá que as chaves se comportam quase exatamente da mesma maneira, exceto que, a menos que você as envolva em um tubo, as chaves não criarão uma subshell e, portanto, permitirão que você defina as variáveis ​​internas.

{
  /your/first/command
  /your/second/command
} &> /dev/null

Veja o manual do bash sobre redirecionamentos para mais detalhes, opções e sintaxe.

Jeff Bowman
fonte
Oi, eu sei que é uma pergunta antiga, mas o mesmo pode ser feito condicionalmente? Como eu quero ocultar a saída sob certas condições? Eu sei que posso replicar a mesma parte em if-else, mas existe uma maneira melhor de fazer isso?
Usama Zafar
@UsamaZafar Eu faria isso definindo uma variável ( "parâmetro de shell" ), que você definiu como /dev/nullou /dev/stdout(ou /path/to/a/logfile) condicionalmente antes no script, e então redirecionando para esse destino usando &> $output_dest(ou qualquer que seja o nome). Se você não quiser combinar stdout e stderr nesse caso, você pode redirecioná-los separadamente como > $output_dest 2> $errors_dest.
Jeff Bowman
35

Você pode redirecionar stdout para / dev / null.

yum install nano > /dev/null

Ou você pode redirecionar stdout e stderr,

yum install nano &> /dev/null.

Mas se o programa tiver uma opção silenciosa, isso é ainda melhor.

ktm5124
fonte
23

Um processo normalmente tem duas saídas para triagem: stdout (saída padrão) e stderr (erro padrão).

Normalmente, as mensagens informativas vão para sdoute os erros e alertas vão para stderr.

Você pode desligar stdoutpara um comando fazendo

MyCommand >/dev/null

e desligue stderrfazendo:

MyCommand 2>/dev/null

Se você quiser desligar os dois , pode fazer:

MyCommand 2>&1 >/dev/null

O 2>&1diz enviar stderr para o mesmo lugar que stdout.

LeOn - Han Li
fonte
8

Você pode redirecionar a saída para /dev/null. Para obter mais informações sobre / dev / null, leia este link .

Você pode ocultar a saída de um comando das seguintes maneiras:

echo -n "Installing nano ......"; yum install nano > /dev/null; echo " done."; 

Redirecione a saída padrão para /dev/null, mas não o erro padrão. Isso mostrará os erros que ocorrem durante a instalação, por exemplo, se yumnão conseguir encontrar um pacote.

echo -n "Installing nano ......"; yum install nano &> /dev/null; echo " done.";

Embora este código não mostre nada no terminal, já que o erro padrão e a saída padrão são redirecionados e, portanto, anulados para /dev/null.

Giuseppe Pes
fonte
1
Grande parte .... cara, você pode me mostrar como
gerar
5

>/dev/null 2>&1vai silenciar stdoutestderr

yum install nano >/dev/null 2>&1
Quanlong
fonte
4

Você não deve usar o bash neste caso para se livrar da saída. Yum tem uma opção -qque suprime a saída.

Você certamente também desejará usar -y

echo "Installing nano..."
yum -y -q install nano

Para ver todas as opções do yum, use man yum.

kkeller
fonte
Obrigado, presumi que o yum tinha um desde apt-get used -qq também para suprimir. Isso foi útil para o que estou fazendo.
Hyperion
0
.SILENT:

Digite ".SILENT:" no início do seu script sem dois pontos.

Arif
fonte