Если первым аргументом к скрипту является имя задания
, а вторым - команда1 && command2 && command3
, то команда, которую вы строите в переменной join
, является чем-то вроде
command1 && command2 && command3>> /path/to/cron/log/dir/May_12_2015/jobname_2015-05-12_01-09-25.log 2>&1
Вы вызываете eval
на этой строке, и она обрабатывается обычным способом. Переадресация относится только к `команде3.
Вы хотите трактовать второй аргумент как фрагмент оболочки, а не как префикс фрагмента оболочки. Так что не надо к нему примыкать. Переадресация принадлежит непосредственно в скрипте, а не под eval
, так как вы указываете ее непосредственно в скрипте, а не через строку, которую нужно разобрать. Обратите внимание, что ваш код прервется, если имя задания
будет содержать какой-либо специальный символ оболочки, например, $CRON_WRAPPER $(touch /tmp/foo)
выполнит код touch /tmp/foo
.
Другая проблема с вашим скриптом в том, что вы ставите запятые между аргументами, если их больше двух, что не имеет смысла. Соединение их пробелами имело бы больше смысла, и это просто "$*
. (Для соединения с запятыми, как разделителями, то, что вы сделали, слишком сложно. В zsh используйте ${(j:,:)@}
. )
Замените часть сценария, начиная с # Объединяя команды:
на
eval "$*" >>$CRON_LOG_FILE 2>&1