Bash 脚本仅因“不是有效标识符”而从 cron 失败

Bash 脚本仅因“不是有效标识符”而从 cron 失败

我有一个脚本,它每周创建一个新的日志文件,可以使用日志文件参数从其他脚本调用它。它不使用任何参数,而是创建一个带有父进程名称的日志~/bin/log。这在终端中运行良好,但在 cron 作业中失败,并抱怨该函数default-log“不是有效的标识符”。

这个函数看起来很简单,但它所做的一切都很好外部函数。我可以轻松解决这个问题,因为该函数只被调用两次,我只需替换整整 2 行,但我还是想了解到底发生了什么。

其他详情:

  • 不是 root cron 作业
  • cron 任务实际上是一个调用这个脚本(weekly-log "$LOG")但所有的回响路径等在我的调试中看起来很好
  • 使用 gnome-schedule 中的“运行选定任务”进行测试。这似乎会产生相同的环境,但您可以看到输出。
  • Ubuntu 16.04


#!/bin/bash
#
# Start fresh logfile each Monday using the supplied path/name
# or create in ~/bin/logs with the name of the calling script

LOG=""
PARENT="$(ps -o comm= $PPID)"
DATEFORMAT="+%a %e %b %Y %I:%M:%S %P %Z"
# Thu 26 Jan 2017 01:52:49 pm AEDT

# Debugging—these all look OK
echo "Args: $*"
echo "PPID: $PPID"
echo "PARENT: $PARENT"
echo "HOME: $HOME"
echo "Default LOG: $HOME/bin/log/$(basename "$PARENT").log"
mkdir -p "$HOME/bin/log"

function default-log {
  mkdir -p "$HOME/bin/log"
  LOG="$HOME/bin/log/$(basename "$PARENT").log"
}

if [ $# -eq 0 ] ; then
   echo "No args"
   default-log
#   mkdir -p "$HOME/bin/log"
#   LOG="$HOME/bin/log/$(basename "$PARENT").log"
else
  DIR=$(dirname "$1")
  # dirname returns "." for invalid path!
  if [ ! "$DIR" = "." ] && [ -d "$DIR" ] ; then
    LOG="$1"
  else
    echo "Invalid path"
    default-log
#    mkdir -p "$HOME/bin/log"
#    LOG="$HOME/bin/log/$(basename "$PARENT").log"
    echo "Invalid path to log file: $1" 2>&1 | tee "$LOG"
  fi
fi

# Create new log or append
if [[ $(date +%u) -eq 1 ]] ; then
  echo "--------------------------------" 2>&1 | tee "$LOG"
else
  echo 2>&1 | tee -a "$LOG"
  echo "--------------------------------" 2>&1 | tee -a "$LOG"
fi
echo $(date "$DATEFORMAT") 2>&1 | tee -a "$LOG"
echo "" 2>&1 | tee -a "$LOG"

答案1

根据 POSIX,函数名称只能包含单词字符([a-zA-Z0-9_])(来源:第1部分第2部分)。将函数名称从 更改default-logdefault_log

但是,Bash 通常对函数名称非常宽容,所以我不确定它为什么会失败。

相关内容