Могу ли я изменить файл сценария bash (.sh) во время его работы?

Возможно, работает Emesene?

1
задан 16 June 2014 в 20:27

3 ответа

Я добавлю то, что, как я думаю, не было сказано в других ответах. Многое зависит от того, как вы редактируете файл. Полагаю, что echo "stuff" >file из оболочки (другой экземпляр) действительно перезапишет файл. Но если вы отредактируете файл, например, emacs, а затем сохраните его, этого не произойдет. Вместо этого редактор переименовывает старый файл в какое-то имя резервной копии (возможно, фактически удаляет предыдущую резервную копию), а затем записывает его модифицированное содержимое буфера в качестве нового файла с (теперь созданным) старым именем. Поскольку интерпретатор (или другой интерпретатор), читающий скрипт, почти наверняка откроет файл только один раз, он впоследствии будет независим от местонахождения имени файла, он просто продолжает читать файл физического диска (идентифицированный номером inode), который был связан к имени файла во время открытия. Поэтому, даже если он читает скрипт в блоках (это было бы самым простым решением при использовании буферизованного ввода-вывода), он продолжал читать строки из старого экземпляра файла, который, вероятно, не изменится при редактировании.

4
ответ дан 24 May 2018 в 06:36
  • 1
    +1 Я использую Sublime Text в качестве моего редактора. Знаете ли вы, что он переименовывает файл, например emacs? – becko 16 June 2014 в 22:03
  • 2
    Я думаю, что большинство редакторов будут использовать схему переименования (даже если они не должны хранить резервные версии), чтобы избежать риска того, что, если во время процесса записи произошел сбой, ни одна нетронутая версия текста не осталась бы вообще. Вы можете проверить с помощью " ls -i " (который показывает номера inode), каково поведение вашего редактора. – Marc van Leeuwen 17 June 2014 в 08:48

Ответ @ jobin в целом правильный, но я добавлю другие ответы, которые могут быть в зависимости от того, что вы хотите сделать.

Если вы хотите изменить сценарий и хотите знать что это безопасно, тогда вы хотите написать новый файл, а не существующий. Новый файл может быть расположен там, где был старый. Напишите новую версию в новый файл, а затем используйте mv, чтобы переместить ее на место поверх старой. Файл, который был заменен, все еще существует, он просто не связан с каталогом. Ваш исполняемый скрипт может продолжать использовать его, и когда этот скрипт закрывает свой дескриптор файла, система знает, что он может безопасно очистить файл (как сразу, так и позже).

Если вы хотите вести себя поведение сценария «на лету», у вас есть более сложная проблема. Я ожидаю, что вам нужно будет создать его в коде сценария. Сценарии Bash могут обрабатывать сигналы (например, можно поймать что-то вроде kill -USR1 [pid]), и тогда скрипт может ответить, перезагрузив некоторый код. Поэтому, возможно, вы можете получить функциональность близко к тому, что хотите, но, не зная, что вам нужно, я не вижу достаточных оснований для этого, и я подозреваю, что если вы хотите сделать что-то такое, вам, вероятно, понадобится более сложный язык программирования, чтобы сделать это.

Если вы хотите взломать поведение запущенного скрипта, который не написан с учетом этого, вам не повезло. Я бы стеснялся назвать любую задачу программирования невозможной, но если бы у вас были ресурсы и навыки для такого рода задач, вы, вероятно, не спрашивали здесь.

0
ответ дан 24 May 2018 в 06:36

это должно быть обновлено, ответы выше в настоящее время только частично правильны:

с текущей версией bash, изменяя скрипт на диске во время его запуска, заставит bash «попробовать» загрузить изменения в памяти и задействовать их в запущенном скрипте. если ваши изменения появятся после текущей строки, новые строки будут загружены и выполнены. но это может быть предположение bash, и это может привести к правильному или неправильному.

, лучший способ сделать это - следующая последовательность действий: 1) загрузить сценарий в память 2) удалить скрипт из диск 3) напишите новый скрипт на диск, сначала удалив версию диска, версия памяти теряет ссылки на него, так что когда вы добавите новую версию на шаге 3, никакая попытка bash не будет сделана, чтобы загрузить новое содержимое в память версия.

0
ответ дан 24 May 2018 в 06:36

Другие вопросы по тегам:

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