Como redirecionar stdout e stderr no script bash com caixas de diálogo?

Como redirecionar stdout e stderr no script bash com caixas de diálogo?

Para um único script redirecionando stdout e stderr para um arquivo com isto:

./myscript.sh 2>&1 | tee -a out_file

funciona bem. Quando tento executar da mesma forma um script contendo várias caixas de diálogo criadas comdiálogocomando (e chamando outros scripts)

./main.sh 2>&1 | tee -a out_file

o out_file contém caracteres indesejados devido a essas caixas. Por exemplo:

#!/bin/bash
# myscript.sh

dialog --title "Title" \
--msgbox "Message Box" \
30 120
date 

gera com:

$ ./myscript.sh 2>&1 | tee -a myscript.out

várias linhas semelhantes a esta:

[36m[44m  [30m[40m[K[22;38H[39;49m(B[m[2;3H[30m[47mMessage Box[22;38H[39;49m(B[m

Como posso obter stdout e stderr sem esses caracteres (para os scripts principais e todos os scripts subsequentes)? Isso seria no exemplo a saída dedata. Seria bom ter o que um usuário inseriu em uma caixa de entrada.

Responder1

Você está tentando registrar a saída codificada por cores em um arquivo. Veja cores e formatação no bash:https://misc.flogisoft.com/bash/tip_colors_and_formatting

Você não pode alterar arbitrariamente o stdout neste caso. Porque se você otimizar o stdout para registro, também alterará a saída que os usuários veem.

Mas você tem algumas possibilidades:

  • A maneira mais fácil é adicionar em seu myscript.sh o comando echo "Message Box printed" >> myscript.outpara registrar algumas ações diretamente no arquivo.

  • Você pode tentar ./myscript.sh 2>&1 | sed -e "s/<your regex>//g" | tee -a myscript.outsubstituir <your regex>. Mas essa mudança também resulta. Então acho que não é isso que você está procurando.

  • Ou você cria seu próprio descritor em myscript.sh echo "Exit code: $? Textbox $usertext" 1>&4e modifica o comando de diálogo como este usertext=$(dialog --title "Title" --inputbox "Enter your text:" 30 120 "My Text" 3>&1 1>&2 2>&3)Então você pode usar. myscript.sh 4>> myscript.out

informação relacionada