Команда Bash в строке выполняется, когда я создаю строку, не, когда я использую ее позже

Существует широкий спектр демонов крона вокруг, если Вы не говорите, которые требуют тот, который Вы используете (обработка списков в таких угловых случаях могла очень хорошо измениться от версии до следующего) не может быть ответа. Лучший выбор состоит в том, чтобы пойти с Вашим явным списком. Я не был бы слишком удивлен, берет ли некоторая реализация Ваш циклический возврат в качестве странного способа сказать 4-22...

Ваша локальная документация даже упоминает этот вид случая? Возможно, законно иметь два списка, например. 22-24,1-4?

10
30.04.2014, 02:36
2 ответа

Это немного сложно. Информация, которую предоставил 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 в большинстве ситуаций, но это один из тех случаев, когда я не знаю хорошего способа избежать этого. Надеюсь, это поможет. Удачи!

8
27.01.2020, 20:01

Существует несколько уровней кавычек. Двойные кавычки ("...") защищают пробельные символы и несколько специальных символов (~, &, |, ;, ...), но не предотвращают расширение параметров и подстановку команд.

Перед "опасными" символами нужны либо одинарные кавычки ('), либо обратная косая черта.

В общем: $(tail ...) вместо обратных кавычек. Обратные символы - более старый стандарт, но мы говорим о настолько старом, что $() не вызывает проблем у большинства людей. Новая версия легче читается и может быть вложенной. Не говоря уже о проблемах с форматированием здесь, на sx...

6
27.01.2020, 20:01

Теги

Похожие вопросы