Существует широкий спектр демонов крона вокруг, если Вы не говорите, которые требуют тот, который Вы используете (обработка списков в таких угловых случаях могла очень хорошо измениться от версии до следующего) не может быть ответа. Лучший выбор состоит в том, чтобы пойти с Вашим явным списком. Я не был бы слишком удивлен, берет ли некоторая реализация Ваш циклический возврат в качестве странного способа сказать 4-22
...
Ваша локальная документация даже упоминает этот вид случая? Возможно, законно иметь два списка, например. 22-24,1-4
?
Это немного сложно. Информация, которую предоставил Hauke, верна, это просто вопрос ее разбора для вашего варианта использования.
Самый простой способ - использовать синтаксис $ ()
при экранировании $
, чтобы определение переменной не выполняло команду, заключенную в $ ()
на момент определения. Предостережение заключается в том, что конечный результат должен быть затем повторно оценен (через eval
) оболочкой во время фактического выполнения для выполнения вложенной команды.
Гораздо проще рассмотреть пример, поэтому возьмите этот, он должен направить вас на правильный путь:
for((i=0;i<10;i++)); do
date +%s.%N # Print a timestamp (in format seconds.nanoseconds)
test="echo \$(date +%s.%N)" # Save a command to do the same
sleep 1 # Sleep for a second
eval "$test" # Evaluate the command saved in variable 'test'
echo # Print a new line before the next iteration
done
Вот пример вывода из приведенного выше примера (обрезанный до одной итерации):
1398832186.133661344
1398832187.139076728
Вы заметите что вторая временная метка для каждого цикла примерно на секунду позже первой. И наоборот, если вы выполните тот же тест без выхода из $
в определении теста
и удаления eval
, две отметки времени будут почти совпадать.
Не привыкайте использовать eval
в большинстве ситуаций, но это один из тех случаев, когда я не знаю хорошего способа избежать этого. Надеюсь, это поможет. Удачи!
Существует несколько уровней кавычек. Двойные кавычки ("..."
) защищают пробельные символы и несколько специальных символов (~
, &
, |
, ;
, ...), но не предотвращают расширение параметров и подстановку команд.
Перед "опасными" символами нужны либо одинарные кавычки ('
), либо обратная косая черта.
В общем: $(tail ...)
вместо обратных кавычек. Обратные символы - более старый стандарт, но мы говорим о настолько старом, что $()
не вызывает проблем у большинства людей. Новая версия легче читается и может быть вложенной. Не говоря уже о проблемах с форматированием здесь, на sx...