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