Bash输出到屏幕和日志文件的方式不同

时间:2016-09-15 15:52:57

标签: linux bash

我一直在尝试使用bash脚本在终端和日志文件上输出不同的内容但不确定要使用的命令。

例如,

#!/bin/bash
freespace=$(df -h / | grep -E "/" | awk '{print $4}')
greentext="\033[32m"
bold="\033[1m"
normal="\033[0m"
logdate=$(date +"%Y%m%d")
logfile="$logdate"_report.log

exec > >(tee -i $logfile)

echo -e $bold"Quick system report for "$greentext"$HOSTNAME"$normal
printf "\tSystem type:\t%s\n" $MACHTYPE
printf "\tBash Version:\t%s\n" $BASH_VERSION
printf "\tFree Space:\t%s\n" $freespace
printf "\tFiles in dir:\t%s\n" $(ls | wc -l)
printf "\tGenerated on:\t%s\n" $(date +"%m/%d/%y") # US date format
echo -e $greentext"A summary of this info has been saved to $logfile"$normal

我想在日志文件中省略最后一个输出(echo"摘要..."),同时在终端中显示它。有命令这样做吗?如果可以提供通用解决方案而不是特定解决方案会很好,因为我想将其应用于其他脚本。

编辑1(在应用>& 6之后):

Files in dir:   7
A summary of this info has been saved to 20160915_report.log
Generated on:   09/15/16

1 个答案:

答案 0 :(得分:0)

一个选项:

exec 6>&1    # save the existing stdout
exec > >(tee -i $logfile)   # like you had it
#... all your outputs
echo -e $greentext"A summary of this info has been saved to $logfile"$normal >&6   
    # writes to the original stdout, saved in file descriptor 6  ------------^^^

>&6echo的输出发送到保存的文件描述符6(终端,如果您从交互式shell运行它)而不是输出路径由tee设置(在文件描述符1上)。在bash上测试4.3.46。

参考文献:"Using exec""I/O Redirection"

修改当OP找到时,>&6消息不会保证在tee off stdout打印的行后显示。一种选择是使用script,例如,在this question的答案中,而不是tee,然后在script之外打印最终消息。根据{{​​3}},该问题的stdbuf个答案无法与tee一起使用。

尝试肮脏的黑客攻击:

#... all your outputs
echo >&6  # <-- New line
echo -e $greentext ... >&6

或者,同样hackish,(注意,根据OP,这有效)

#... all your outputs
sleep 0.25s   # or whatever time you want  <-- New line
echo -e ... >&6