I have a script that creates a new log file each week that can be called from other scripts with a log file parameter. Without any arguments it creates a log with the name of the parent process in ~/bin/log. This works fine in a terminal, but in a cron job it fails complaining that the function default-log is “not a valid identifier”.

The function seems trivial and everything it does works fine outside the function. I can easily work around this as the function is only called twice and I can just substitute the whole 2 lines, but I’d still like to understand what’s going on.

Other details:

  • Not a root cron job
  • The cron job is actually a script that calls this (weekly-log "$LOG") but all the echoed paths, etc. in my debugging look fine
  • Tested using “Run selected task” in gnome-schedule. This seems to produce the same environment, but you get to see the output.
  • Ubuntu 16.04

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

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 "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"
#   mkdir -p "$HOME/bin/log"
#   LOG="$HOME/bin/log/$(basename "$PARENT").log"
  DIR=$(dirname "$1")
  # dirname returns "." for invalid path!
  if [ ! "$DIR" = "." ] && [ -d "$DIR" ] ; then
    echo "Invalid path"
#    mkdir -p "$HOME/bin/log"
#    LOG="$HOME/bin/log/$(basename "$PARENT").log"
    echo "Invalid path to log file: $1" 2>&1 | tee "$LOG"

# Create new log or append
if [[ $(date +%u) -eq 1 ]] ; then
  echo "--------------------------------" 2>&1 | tee "$LOG"
  echo 2>&1 | tee -a "$LOG"
  echo "--------------------------------" 2>&1 | tee -a "$LOG"
echo $(date "$DATEFORMAT") 2>&1 | tee -a "$LOG"
echo "" 2>&1 | tee -a "$LOG"
  • What does your cron line look like? – muru Mar 10 '17 at 2:56
  • 40 16 * * * export LANGUAGE=en;/home/sean/bin/get-apod # JOB_ID_8. My system locale is Irish, but errors are easier to debug in English. get-apod calls this script as shown above. – Moilleadóir Mar 10 '17 at 3:04

According to POSIX, function names can contain only word characters ([a-zA-Z0-9_]) (source: part 1, part 2). Change the function name from default-log to default_log.

But, Bash is normally very lenient about function names, so I'm not sure why it's failing.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.