我一直在尝试使用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
答案 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 ------------^^^
>&6
将echo
的输出发送到保存的文件描述符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