如何根据以下要求使用带有 echo 的 tee 命令?

如何根据以下要求使用带有 echo 的 tee 命令?

附加包含命令和日志文件名的变量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

相关内容