Você pode redirecionar read
stderr
para stdout
:
read -p "Input: " x 2>&1
script.sh
:
#!/bin/bash
read -p "Input: " x 2>&1
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.
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()
Você pode redirecionar read
stderr
para stdout
:
read -p "Input: " x 2>&1
script.sh
:
#!/bin/bash
read -p "Input: " x 2>&1
Tags command-line bash