Для одного скрипта, перенаправляющего 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 без этих символов (для основного и всех последующих сценариев)? Это было бы в примере вывода даты . Приятно иметь то, что пользователь ввел в поле ввода.
tr -d 'ﮛ'
может быть, как./main.sh 2>&1 | tr -d 'ﮛ' | tee -a out_file
dialog --stdout ...
Ответы:
Вы пытаетесь записать вывод с цветовой кодировкой в файл. Посмотреть цвета и форматирование в 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
источник