Como ocultar stderr sem entrada de usuário “muting”

3

Para simplificar, eu tenho um script que usa read -e para pegar a entrada do usuário, mas por causa do ambiente, muitas mensagens de 'pipes quebrados' aparecem e poluem a tela. Eu queria esconder stderr, então eu tentei isso:

main 2>/dev/null 

Qual funciona , por si só, eu sou capaz de dar entrada, e os erros do cano quebrados são tão bons quanto foram. No entanto, aparentemente, este método é como funciona a entrada de senha, porque ele silencia minha entrada. Não consigo ver o que estou escrevendo.

É possível redirecionar os streams de maneira que eu possa silenciar stderr sem silenciar a entrada? Eu estou supondo read está usando stderr para entregar o prompt, o que pode tornar isso impossível, mas não faz mal perguntar.

Para fins de argumentação, o script foi projetado para ser executado no ambiente mencionado e não posso simplesmente mudar para um diferente.

Quanto a main , é uma função que lida com E / S com o usuário e chama outras funções. Aqui está uma versão simplificada:

main(){
  while true; do
    get_input $(get_completions)
    [ $choice == "d" ] && fn_delete; continue
    [ $choice == "vwr" ] && fn_change_vwr_command; continue
    [ ... ]
  done
}

Funciona bem sozinho. É quando eu executo main 2>/dev/null que os erros desaparecem e minha entrada é silenciada.

Editar

Isso foi resolvido. A correção é redirecionar o stderr de leitura para seu stdout com 2>&1 .

Veja, é por isso que eu gosto de fazer uma única função "input-getter" sempre que lida com a entrada do usuário. Para mim, implementar o patch mencionado foi tão simples quanto editar uma única linha em get_input()

    
por Braden Best 13.07.2015 / 22:53

1 resposta

3

Você pode redirecionar read stderr para stdout :

read -p "Input: " x 2>&1

script.sh :

#!/bin/bash
read -p "Input: " x 2>&1

    
por kos 13.07.2015 / 23:25