Se o primeiro argumento do script for jobname
e o segundo for command1 && command2 && command3
, o comando criado na variável joined
será algo como
command1 && command2 && command3>> /path/to/cron/log/dir/May_12_2015/jobname_2015-05-12_01-09-25.log 2>&1
Você chama eval
nessa string e ela é analisada normalmente. O redirecionamento só se aplica a 'command3.
Você deseja tratar o segundo argumento como um fragmento de shell, não como um prefixo de um fragmento de shell. Então não concatene coisas para isso. O redirecionamento pertence diretamente ao script, não sob eval
, pois você está especificando-o diretamente no script e não por meio de uma string que precisa ser analisada. Tenha em atenção que o seu código seria quebrado se jobname
continha qualquer caractere especial de shell, por ex. $CRON_WRAPPER $(touch /tmp/foo) stuff
executaria o código touch /tmp/foo
.
Outro problema com o seu script é que você está colocando vírgulas entre os argumentos se houver mais de dois, o que não faz sentido. Unir-se a eles com espaços faria mais sentido, e isso é simplesmente "$*
. (Para unir-se a vírgulas como separadores, o que você fez é excessivamente complexo. Em zsh, use ${(j:,:)@}
.)
Substitua a parte do script que começa por # Joining commands:
por
eval "$*" >>$CRON_LOG_FILE 2>&1