我正在尝试创建一个能够记录命令执行成功与否的函数。
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
由于我经常写文件,因此用户无权使用>>
附加到文件。
答案 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
的危险。