Как я могу “кэшировать” переменную в Bash?

Попробовать

touch ./*

Это избегает ненужного for цикл, который породил бы новый процесс для каждого файла и работы для всех имен файлов, даже с пробелами или, которые похожи на опции (как -t). Единственное время это не работало бы, - то, если бы у Вас нет (неточечных) файлов в каталоге, в этом случае, Вы закончили бы тем, что создали названный файл *. Избегать что, для конкретного случая touch большинство реализаций имеет a -c опция (также названный --no-create в версиях GNU) для не создания несуществующих файлов, т.е.

touch -c ./*

См. также хорошие ссылки в ответе jasonwryan, а также этом.

3
21.09.2011, 17:03
2 ответа

Запишите второй сценарий, который делает фактическое вычисление и сохраняет результат в файл:

# calculate $curval
echo $curval > /var/foo/value.txt

Запланируйте его с cron работать каждые 2-3 часа.

За "каждые 10 минут" сценарий, просто считайте текущее значение из файла:

curval=`cat /var/foo/value.txt`

Хорошее улучшение должно назвать сценарий вычисления с "каждых 10 минут" сценарием если value.txt файл еще не существует. Вы могли даже заставить его добавить crontab запись, если это отсутствует.

9
27.01.2020, 21:10
  • 1
    Три проблемы: необходимо заключить в кавычки $curval для предотвращения проблем с IFS, и необходимо также использовать printf, поскольку Вы не можете сказать то, что находится в файле, таким образом, echo небезопасно (это могло передать любой аргумент эху). Кроме того, нет никакой потребности вызвать внешнюю команду cat считать файл в переменную когда bash может сделать это само, в форме $(</var/foo/value.txt). –  Chris Down 21.09.2011, 17:17
  • 2
    Да, все это. :) –  Warren Young 21.09.2011, 17:32

Я согласился бы с записью результата в файл, установил бы переменную в файле

curval=the_value

Затем в оболочке (или другой сценарий)

source current_variable_value_result_file
1
27.01.2020, 21:10

Теги

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