![如何编写一个同时写入控制台和日志文件的函数?](https://linux22.com/image/1435859/%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%E4%B8%80%E4%B8%AA%E5%90%8C%E6%97%B6%E5%86%99%E5%85%A5%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%92%8C%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E7%9A%84%E5%87%BD%E6%95%B0%EF%BC%9F.png)
我想编写一个函数,将消息同时写入控制台和日志文件。我最初的尝试是这样的:
function log_write {
local message=$1
local log_file=$2
echo "${message}" | tee -a ${log_file}
}
但那行不通——我猜是因为函数上下文中的 echo 表示“返回一个值”,而不是写入控制台。我错过了什么?我在脚本中像这样调用它:
message='something interesting happened'
log_file='my_script.log'
$(log_write $message $log_file)
另外,我通过 msysgit 端口在 Windows 上运行它,但我发现问题双重存在。
答案1
这命令替换语法是这里的问题:
$(log_write $message $log_file)
调用该函数,并且返回输出,准备在变量中捕获。但是,您没有这样做。
相反,你想像调用其他命令一样调用你的函数:
log_write "$message" "$log_file"
注意引号:它们对于将多字消息保留为单个参数至关重要。否则,如果您这样做:
message="hello world"
log_write $message $log_file
然后,你将看到单词“hello”写入文件“world”。这是因为单词拆分在变量扩展之后。经验法则:总是引用你的变量,除非你明确想要单词拆分和文件名扩展省略引号的效果。还有省略引号的安全隐患