Сценарий Bash перестал работать *только* от крона с “не допустимый идентификатор”

У меня есть сценарий, который создает новый файл журнала каждую неделю, который можно назвать из других сценариев с параметром файла журнала. Без любых аргументов это создает журнал с названием родительского процесса в ~/bin/log. Это хорошо работает в терминале, но в задании крона это приводит жалобу к сбою что функция default-log “не допустимый идентификатор”.

Функция кажется тривиальной и все, что она делает хорошо работает вне функции. Я могу легко работать вокруг этого, поскольку функция только вызвана дважды, и я могу просто заменить целыми 2 строками, но я все еще хотел бы понять то, что продолжается.

Другие детали:

  • Не корневое задание крона
  • Задание крона является на самом деле сценарием, который называет это (weekly-log "$LOG") но все отраженные пути, и т.д. в моей отладке выглядят хорошо
  • Протестированное использование “Выполняет выбранную задачу” в расписании гнома. Это, кажется, производит ту же среду, но Вы добираетесь для наблюдения вывода.
  • 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"
0
задан 9 March 2017 в 19:50

1 ответ

Согласно POSIX, имена функций могут содержать только словесные символы ([a-zA-Z0-9_]) (источник: часть 2 части 1 , ). Измените имя функции от default-log до default_log.

, Но, Bash обычно очень снисходителен об именах функций, таким образом, я не уверен, почему он перестал работать.

2
ответ дан 3 November 2019 в 15:43

Другие вопросы по тегам:

Похожие вопросы: