Скрипт Bash, который обновляет себя?

#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. Тьфу, поцарапай это, проблемы с веб-сайтом 🙂