【问题标题】:Bash redirect stderr and stdout to function stops executionBash 将 stderr 和 stdout 重定向到函数停止执行
【发布时间】: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 使用。

标签: linux bash shell


【解决方案1】:

LogMsg 只有 ONE 读取,然后结束,杀死 mongodump.sh。 LogMsg 应该循环,直到所有内容都被读取。

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2010-10-14
    • 1970-01-01
    • 2022-01-18
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多