如何编写一个同时写入控制台和日志文件的函数?

che*_*r89 2 linux bash

我想编写一个将消息写入控制台和日志文件的函数。我最初的尝试是这样的:

function log_write {
    local message=$1
    local log_file=$2
    echo "${message}" | tee -a ${log_file}
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用 - 我猜是因为函数上下文中的 echo 意味着“返回一个值”,而不是写入控制台。我错过了什么?我在我的脚本中这样调用它:

message='something interesting happened'
log_file='my_script.log'
$(log_write $message $log_file)
Run Code Online (Sandbox Code Playgroud)

另外,我通过 msysgit 端口在 Windows 上运行它,但我把这个问题加倍了。

gle*_*man 5

命令替换语法这里的问题是:

$(log_write $message $log_file)
Run Code Online (Sandbox Code Playgroud)

这将调用函数,并返回输出,准备好在变量中捕获。然而,你并没有这样做。

相反,您想像调用任何其他命令一样调用您的函数:

log_write "$message" "$log_file"
Run Code Online (Sandbox Code Playgroud)

请注意引号:它们对于将多字消息作为单个参数保持至关重要。否则,如果你这样做:

message="hello world"
log_write $message $log_file
Run Code Online (Sandbox Code Playgroud)

然后,您将在文件“world”中写入单词“hello”。这是由于变量扩展后分词造成的。经验法则:始终引用您的变量,除非您明确希望省略引号的分词和文件名扩展效果。省略引号也有安全隐患