如何使用对话框重定向 bash 脚本中的 stdout 和 stderr?

如何使用对话框重定向 bash 脚本中的 stdout 和 stderr?

对于将 stdout 和 stderr 重定向到文件的单个脚本,如下所示:

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

运行正常。当我尝试以同样的方式运行包含使用对话命令(并调用其他脚本)

./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(对于主脚本和所有后续脚本)?在示例中,输出日期。很高兴能看到用户在输入框中输入的内容。

答案1

您正在尝试将颜色编码的输出记录到文件中。请参阅 bash 中的颜色和格式:https://misc.flogisoft.com/bash/tip_colors_and_formatting

在这种情况下,您不能随意更改 stdout。因为如果您优化 stdout 以进行日志记录,那么您也会更改用户看到的输出。

但你有一些可能性:

  • 最简单的方法是在 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

相关内容