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.
echo "Installing nano ......"; yum install nano &> /dev/null
Respostas:
Usa isto.
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:
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>&-
: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:>&2
redireciona stdout para o descritor 2 (stderr),>&3
redireciona 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: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:
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.Veja o manual do bash sobre redirecionamentos para mais detalhes, opções e sintaxe.
fonte
/dev/null
ou/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
.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.
fonte
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
sdout
e os erros e alertas vão parastderr
.Você pode desligar
stdout
para um comando fazendoe desligue
stderr
fazendo:Se você quiser desligar os dois , pode fazer:
O
2>&1
diz enviar stderr para o mesmo lugar que stdout.fonte
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:
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, seyum
não conseguir encontrar um pacote.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
.fonte
>/dev/null 2>&1
vai silenciarstdout
estderr
fonte
Você não deve usar o bash neste caso para se livrar da saída. Yum tem uma opção
-q
que suprime a saída.Você certamente também desejará usar
-y
Para ver todas as opções do yum, use
man yum
.fonte
Digite ".SILENT:" no início do seu script sem dois pontos.
fonte