我有一个脚本,它每周创建一个新的日志文件,可以使用日志文件参数从其他脚本调用。没有任何参数,它会创建一个带有父进程名称的日志~/bin/log
。这在终端中可以正常工作,但在 cron 作业中它无法抱怨该函数default-log
“不是有效的标识符”。
该功能似乎微不足道,它所做的一切在功能之外都可以正常工作。我可以轻松解决这个问题,因为该函数只调用了两次,我可以替换整个 2 行,但我仍然想了解发生了什么。
其他详情:
- 不是根 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"
根据 POSIX,函数名称只能包含单词字符 (
[a-zA-Z0-9_]
)(来源:part 1,part 2)。将函数名称从 更改default-log
为default_log
。但是,Bash 通常对函数名称非常宽容,所以我不确定它为什么会失败。