这很有效,除了它将标准错误流合并到源代码脚本的标准输出流中。有关如何修复它的任何建议吗?
#!/usr/bin/env bash
# Source this from a script to capture and `tee` standard error and standard
# out to a log file. Calling script must source this script. For Example:
#
# . /usr/bin/logy /var/log/project/$0.log
#
# The logging uses >(process substitution). Process substitution is supported
# in shells like bash and zsh but is not supported in sh.
_LOG=${1?log file}
test $# -eq 1 || exit 1
mkdir -p "$(dirname "$_LOG")"
# Append stdout and stderr to log file
exec > >(
echo -e "START\t$(date)" >> "$_LOG"
tee -a "$_LOG"
echo -e "END\t$(date)" >> "$_LOG"
) 2>&1
以下是一个例子:
. /usr/bin/logy $0.log
echo stdout
echo stderr >&2
exit 1
运行脚本:
$ ./t
$ echo $? # $? is the return value
1
好,返回值1保留了......
记录了什么?
$ cat t.log
START Thu, Feb 07, 2013 2:58:57 PM
stdout
stderr
END Thu, Feb 07, 2013 2:58:57 PM
我们的想法是创建单个日志文件,然后使用logrotate
来维护它们。
这是问题所在。标准输出和错误流已合并。这输出表明标准错误流已标准输出:
./t > /dev/null
这将从echo语句输出两行,显示两者都转到标准输出:
./t 2> /dev/null
是否有一种保存流的好方法,同时保留stdout / err语句的日志文件中的顺序?出于这个原因,我认为两个exec
语句不是一个选项。
答案 0 :(得分:1)
好先生,这应该有用
script_name.sh |& tee -a /var/log/script_name.sh.log
命令的clarify部分
|& was added to Bash 4 as an abbreviation for 2>&1 |