附加包含命令和日志文件名的变量tee
,没有得到预期的结果,因为echo
正在打印变量内容。
以下是文件内容、实际输出和预期结果。
shell脚本内容:
#!/bin/bash
log="2>&1 | tee -a report.txt"
echo ""
echo '***************-:START OF THE REPORT:-***********' $log
运行脚本后。
console op:
***************-:START OF THE REPORT:-*********** 2>&1 | tee -a report.txt
预期的-
console op:
***************-:START OF THE REPORT:-***********
report.txt file content:
***************-:START OF THE REPORT:-***********
另请注意,变量$log
应包含tee
命令和文件名,因为我不想tee
在每个 echo 命令末尾对命令进行硬编码。
答案1
我假设您想使用这种不寻常的方式来标记实际管道并tee
标记到日志消息的末尾,因为您不想对每个echo
?
好吧,你也可以这样做:
logfile='report.txt'
log () {
if [ -z "$1" ]; then
cat
else
printf '%s\n' "$@"
fi | tee -a "$logfile"
}
log "some message"
log "some other message"
log "multi" "line" "output"
{
cat <<LETTER
Dear Sir,
It has come to my attention, that a whole slew of things may be
collected and sent to the same destination, just by using a single
pipe. Just use { ... } | destination
Sincerely, $LOGNAME
LETTER
cat <<THE_PS
PS.
Here's the output of "ls -l":
THE_PS
ls -l
echo "LOL"
} | log
也就是说,将笨拙的tee
命令包装在一个简单的 shell 函数中,该函数的名称很容易输入,只需将输出通过管道传递给它即可。
在此示例中,该log
函数用于printf
输出在其命令行上给出的数据,或者如果这些不是命令行参数,则切换到从标准输入读取。
你甚至可以使用
./your_original_script_without_special_logging 2>&1 | log
答案2
他们让你使用
echo '***************-:START OF THE REPORT:-***********' $log
line 只是将 的内容回显$log
到命令行,而不是像您在控制台中输入该行一样。
要使线路按照您的预期运行,您可以或使用eval
.
eval echo '***************-:START OF THE REPORT:-***********' $log
答案3
您实际上应该使用一个函数来屏蔽命令echo
:
echo ()
{
builtin echo "$@" | tee -a report.txt
}
然后你可以这样做:
echo ""
echo '***************-:START OF THE REPORT:-***********'
无需tee
在命令末尾进行硬编码或其他任何内容echo
。