У меня есть сценарий, который создает новый файл журнала каждую неделю, который можно назвать из других сценариев с параметром файла журнала. Без любых аргументов это создает журнал с названием родительского процесса в ~/bin/log
. Это хорошо работает в терминале, но в задании крона это приводит жалобу к сбою что функция default-log
“не допустимый идентификатор”.
Функция кажется тривиальной и все, что она делает хорошо работает вне функции. Я могу легко работать вокруг этого, поскольку функция только вызвана дважды, и я могу просто заменить целыми 2 строками, но я все еще хотел бы понять то, что продолжается.
Другие детали:
weekly-log "$LOG"
) но все отраженные пути, и т.д. в моей отладке выглядят хорошо
#!/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"
Согласно POSIX, имена функций могут содержать только словесные символы ([a-zA-Z0-9_]
) (источник: часть 2 части 1 , ). Измените имя функции от default-log
до default_log
.
, Но, Bash обычно очень снисходителен об именах функций, таким образом, я не уверен, почему он перестал работать.