对于将 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