Как перенаправить stdout и stderr в скрипте bash с помощью диалоговых окон?

0

Для одного скрипта, перенаправляющего stdout и stderr в файл с этим:

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

работает отлично. Когда я пытаюсь таким же образом запустить скрипт, содержащий несколько диалоговых окон, созданных с помощью команды dialog (и вызывающих другие скрипты)

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

out_file содержит нежелательные символы из-за этих полей. Например:

#!/bin/bash
# myscript.sh

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

генерируется с:

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

несколько строк, похожих на эту:

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

Как я могу получить stdout и stderr без этих символов (для основного и всех последующих сценариев)? Это было бы в примере вывода даты . Приятно иметь то, что пользователь ввел в поле ввода.

coverflower
источник
вы можете использовать tr, чтобы избавиться от него, как, tr -d 'ﮛ'может быть, как./main.sh 2>&1 | tr -d 'ﮛ' | tee -a out_file
barlop
Нам нужны детали сценариев и нежелательных персонажей. Пожалуйста, расширьте свой вопрос, чтобы включить их.
AFH
Попробуйте использовать параметр диалога --stdout,dialog --stdout ...
Paulo

Ответы:

0

Вы пытаетесь записать вывод с цветовой кодировкой в ​​файл. Посмотреть цвета и форматирование в bash: https://misc.flogisoft.com/bash/tip_colors_and_formatting

Вы не можете произвольно изменить стандартный вывод в этом случае. Потому что, если вы оптимизируете стандартный вывод для ведения журнала, вы также изменяете вывод, который видят пользователи.

Но у вас есть несколько возможностей:

  • Самый простой способ - добавить в свой myscript.sh команду echo "Message Box printed" >> myscript.outдля записи некоторых действий непосредственно в файл.

  • Вы можете попробовать ./myscript.sh 2>&1 | sed -e "s/<your regex>//g" | tee -a myscript.outи заменить <your regex>. Но это изменение выхода тоже. Так что я думаю, что это не то, что вы ищете.

  • Или вы создаете свой собственный дескриптор в myscript.sh с помощью echo "Exit code: $? Textbox $usertext" 1>&4и изменяете команду диалога следующим образом. usertext=$(dialog --title "Title" --inputbox "Enter your text:" 30 120 "My Text" 3>&1 1>&2 2>&3)Затем вы можете использовать. myscript.sh 4>> myscript.out

Silerra
источник