O script Bash falha * somente * do cron com “não é um identificador válido”

0

Eu tenho um script que cria um novo arquivo de log a cada semana que pode ser chamado de outros scripts com um parâmetro de arquivo de log. Sem nenhum argumento, ele cria um log com o nome do processo pai em ~/bin/log . Isso funciona bem em um terminal, mas em uma tarefa do cron ele falha ao reclamar que a função default-log não é “um identificador válido”.

A função parece trivial e tudo o que ela faz funciona bem fora da função. Eu posso trabalhar facilmente com isso, pois a função só é chamada duas vezes e eu posso simplesmente substituir as linhas inteiras , mas eu ainda gostaria de entender o que está acontecendo.

Outros detalhes:

  • Não é um trabalho cron do cronograma
  • O cron job é, na verdade, um script que chama isso ( weekly-log "$LOG" ), mas todos os caminhos ecoados etc. na minha aparência de depuração são bons
  • Testado usando "Executar tarefa selecionada" no gnome-schedule. Isso parece produzir o mesmo ambiente, mas você consegue ver a saída.
  • 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"
    
por Moilleadóir 10.03.2017 / 03:50

1 resposta

2

De acordo com o POSIX, os nomes das funções podem conter apenas caracteres de palavras ( [a-zA-Z0-9_] ) (fonte: parte 1 , parte 2 ). Altere o nome da função de default-log para default_log .

Mas, normalmente, o Bash é muito tolerante com os nomes das funções, então não sei por que ele está falhando.

    
por wjandrea 10.03.2017 / 04:04