#bash #self-updating
#bash #самообновление
Вопрос:
Я пишу утилиту, использующую Bash scripting, и я хотел бы включить в нее функцию обновления. В настоящее время скрипт следует философии Ruby gem, например, одна команда с несколькими подкомандами:
gem help
gem version
gem update
В идеале вы бы запустили:
myscript update
Но я не знаю, возможно ли это.
Каков наилучший способ для этого? Я знаю, что запись в текущий запущенный скрипт — плохая идея.
Комментарии:
1. Почему это плохая идея писать в текущий запущенный скрипт?
2. @пользователь неизвестен: это зависит от того, как вы пишете, семантики вашей файловой системы и реализации вашей оболочки. Предположим, ваша командная оболочка читает инструкции из файла по одной за раз, и вам удается изменить файл таким образом, что файл, который она интерпретирует, изменился из-под него. Он может продолжить выполнение в другом месте, на полпути через инструкцию или даже после окончания файла.
3. Разве оболочка не загружает весь скрипт в память перед выполнением?
Ответ №1:
Просто вызовите wget
, чтобы загрузить новую версию. После успешной загрузки переместите его в местоположение текущего скрипта и chmod x
его.
Комментарии:
1. 1. Я бы, наверное, сначала
chmod x
это, а потомexec mv
это. Возможно, перебор, но мне было бы легче спать. 🙂2. В результате получается пустой файл
3. Тьфу, поцарапай это, проблемы с веб-сайтом 🙂