O redirecionamento de Stderr redireciona inesperadamente alguns built-ins BASH, bem

2

Estou tentando esconder todos os stderr dos usuários que executam um script BASH interativo, mas mantenha os erros em um arquivo de log. No entanto, o redirecionamento stderr simples inesperadamente oculta também algumas saídas BASH que devem ser stdout . Já tentei isso em dois sistemas e obtive os mesmos resultados (um tem o GNU bash, versão 4.1.2 (1) -release (x86_64-redhat-linux-gnu) e o outro está no MacOS X) .

Eu tenho uma suspeita persistente de que isso poderia ser causado pelo exec substituindo o shell ... mas outro built-in ( times ) funciona como esperado e saídas para stdout !

Um exemplo:

#!/bin/bash

exec 2>>file_log

echo This will be printed to stdout, as expected

ls ThereIsNoSuchFileOnEarth # this will go to “file_log”, as expected

read –p 'User would never see this prompt and it would go to file_log. Totally unexpected.' –r -e test

species=”Daleks Raxacoricofallapatorians Judoon”

select enemy in $species;
do
     # …code omitted as the user would never see the list. It would go into file_log again!
done
    
por Alexander 14.08.2018 / 17:07

2 respostas

3

Os prompts de read e select devem ir para Erro Padrão, pois são prompts de interação do usuário e não saída real . Isso permite que você execute tool.sh > tool.out e ainda use read e select para coletar informações do usuário sem "contaminar" a saída real.

A Saída Padrão é a saída típica de um programa, idealmente de tal forma que poderia ser canalizada para a Entrada Padrão de outra, sem problemas, nem confusão.

É também por isso que curl , por exemplo, apresenta seu progresso de download no Erro Padrão, em vez da Saída Padrão; você pode curl http://www.example.com/path/to/file > file e somente o conteúdo de file é exibido (e, portanto, redirecionado para file , enquanto os dados informativos são exibidos usando o erro padrão.

    
por 14.08.2018 / 17:16
1

Se você usa exec para redirecionar o stderr para todo o shell, isso afeta todo o shell.

Você não pode usar exec para redirecionar o stderr inteiro, ou precisa chamar algo como:

read .... 2> /dev/tty

para que os builtins em questão criem uma saída legível para o stderr.

    
por 14.08.2018 / 17:16