Bash:记录命令成功/失败

时间:2016-08-11 16:36:19

标签: bash

我正在尝试创建一个能够记录命令执行成功与否的函数。

function LOG_CMD() {
    "$@"
     local exit_code=$?
     if [ $exit_code -eq 0 ]; then
        echo -e "[$(date)]\t[SUCCESS]${@}" | sudo tee -a $LOG_FILE
      else
        echo -e "[$(date)]\t[ERROR]${@}" | sudo tee -a $LOG_FILE
     fi
}

这适用于大多数命令,但我遇到任何使用管道的问题。例如,当我尝试使用pipe和tee创建配置文件时,日志条目将写入配置。

LOG_CMD echo "ALTER USER '${1}'@'localhost' IDENTIFIED BY '${2}';" | sudo tee -a /sql-init

由于我经常写文件,因此用户无权使用>>附加到文件。

1 个答案:

答案 0 :(得分:1)

管道不是参数;他们分开两个完全不同的命令。执行所需操作的唯一方法是将单个字符串参数传递给LOG_CMD,然后使用eval执行它。

LOG_CMD() {
    eval "$1"
    local exit_code=$?
    if [ "$exit_code" -eq 0 ]; then
       result=SUCCESS
    else
       result=ERROR
    fi
    printf '[%s]\t[%s] %s\n' "$(date)" "$result" "$1" | sudo tee -a "$LOG_FILE"
}

LOG_CMD "echo \"ALTER USER '${1}'@'localhost' IDENTIFIED BY '${2}';\" | sudo tee -a /sql-init"

请记住将动态构造的命令传递给eval的危险。