【发布时间】:2018-01-18 13:33:22
【问题描述】:
我有这个 bash 脚本,其中有一个名为 LogMsg 的函数,用于将多个命令的所有输出记录到单个文件中。
但是,当我尝试从另一个 bash 脚本重定向到 stderr 和 stdout 时,只记录了第一行,并且脚本的其余部分似乎没有运行(在我的 bash 文件中调用的脚本)。
#!/bin/bash
#Contains all executions for backup jobs
function LogMsg {
now="$(date +'%d/%m/%Y %T')"
if [ -n "$1" ]
then
IN="$1"
else
read IN
fi
echo "$now [LOG]: $IN" >> $LOG_FILE;
}
LogMsg "Starting backup procedure"
LogMsg "Dumping MongoDB databases"
/bin/bash /root/mongodump.sh 2>&1 | LogMsg
LogMsg "Moving all backups to Backup server"
这将记录以下内容:
18/01/2018 14:28:32 [LOG]: Starting backup procedure
18/01/2018 14:28:14 [LOG]: Dumping MongoDB databases
18/01/2018 14:28:14 [LOG]: connected to: localhost
18/01/2018 14:28:14 [LOG]: Moving all backups to Backup server
但是,如果我删除了2>&1 | LogMsg,那么 mongodump.sh 的其余部分就会被执行,它会在 shell 中吐出更多信息:
root@Debian-81-jessie-64-LAMP:~# ./backupjobs.sh
connected to: localhost
Thu Jan 18 14:28:41.204 DATABASE: example to /root/backups/MongoDB/2018/01/18/14:28:41/example
Thu Jan 18 14:28:41.205 example.system.indexes to /root/backups/MongoDB/2018/01/18/14:28:41/example/system.indexes.bson
Thu Jan 18 14:28:41.205 16 objects
【问题讨论】:
-
我还可以看到许多其他问题。 shellcheck.net 捡到了一对,尽管这里混合了其他气味的有毒混合物。你真的确定你想再次改造糟糕的日志记录吗?
-
无论
mongodump.sh在运行什么,它都会检测其标准输出是否为终端,以相应地调整其输出。 -
@Someprogrammerdude OP 在他的函数中有一个
read命令;您的链接不相关。 -
一个建议是过滤而不是尝试阅读:
if [ -n "$*" ]; then printf "%s [LOG]: %s\n" "$(date...)" "$*"; else sed -e "s@^@$(date ...) [LOG]@"; fi,但整个方法很脆弱。 -
@Someprogrammerdude 该链接没有从标准输入读取的 any 命令。
date将忽略标准输入,留给read使用。