ОБНОВЛЕНИЕ: это репост Как сделать скрипты оболочки устойчивыми к изменению источника при их запуске
Это то, что беспокоит меня время от времени:
- Я пишу сценарий оболочки (bash) для быстрой и грязной работы
- Я запускаю скрипт, и он довольно долго запускается
- Пока он работает, я редактирую несколько строк в скрипте, настраивая его для другой работы
- Но первый процесс все еще читает тот же файл скрипта и все испортил.
Видимо, скрипт интерпретируется путем загрузки каждой строки из файла по мере необходимости . Есть ли способ, чтобы скрипт мог указать оболочке, что весь файл скрипта должен быть одновременно считан в память? Например, Perl-скрипты, кажется, делают это: редактирование файла кода не влияет на процесс, который его сейчас интерпретирует (потому что он изначально анализируется / компилируется?).
Я понимаю, что есть много способов обойти эту проблему. Например, я мог бы попробовать что-то вроде:
cat script.sh | sh
или
sh -c "`cat script.sh`"
... хотя они могут работать некорректно, если файл скрипта большой и существуют ограничения на размер потоковых буферов и аргументов командной строки. Я мог бы также написать вспомогательную оболочку, которая копирует файл сценария в заблокированный временный файл и затем выполняет его, но это не выглядит очень переносимым.
Так что я надеялся на самое простое решение, которое включало бы модификации только в сценарий, а не в способ его вызова. Могу ли я просто добавить одну или две строки в начале скрипта? Я не знаю, существует ли такое решение, но я предполагаю, что оно может использовать переменную $ 0 ...