Для этого вопроса давайте рассмотрим сценарий оболочки bash, хотя этот вопрос должен быть применим ко всем типам сценария оболочки.
Когда кто-то выполняет сценарий оболочки, Linux загружает все сценарии одновременно (возможно, в память) или читает команды сценария одну за другой (строка за строкой)?
Другими словами, если я выполню сценарий оболочки и удаляю его до завершения выполнения, будет ли выполнение завершено или оно продолжится как есть?
linux
shell
shell-script
зарегистрированный пользователь
источник
источник
Ответы:
Если вы используете,
strace
вы можете увидеть, как выполняется сценарий оболочки при его запуске.пример
Скажем, у меня есть этот сценарий оболочки.
Запуск его с помощью
strace
:Если заглянуть внутрь
strace.log
файла, обнаружится следующее.Как только файл прочитан, он выполняется:
Выше мы ясно видим, что весь сценарий читается как единая сущность, а затем выполняется там. Таким образом, он «появился бы», по крайней мере, в случае Bash, в котором он читает файл, а затем выполняет его. Таким образом, вы думаете, что можете редактировать сценарий, пока он работает?
ПРИМЕЧАНИЕ: не надо, хотя! Читайте дальше, чтобы понять, почему вы не должны связываться с запущенным файлом сценария.
А как насчет других переводчиков?
Но ваш вопрос немного не в порядке. Это не Linux, который обязательно загружает содержимое файла, это интерпретатор, который загружает содержимое, так что все зависит от того, как реализован интерпретатор, загружает ли он файл целиком или в виде блоков или строк за раз.
Так почему же мы не можем отредактировать файл?
Если вы используете гораздо больший скрипт, вы заметите, что приведенный выше тест немного вводит в заблуждение. Фактически большинство интерпретаторов загружают свои файлы в блоки. Это довольно стандартно для многих инструментов Unix, где они загружают блоки файла, обрабатывают его, а затем загружают другой блок. Вы можете увидеть это поведение с этими вопросами и ответами U & L, которые я написал некоторое время назад относительно
grep
: « Сколько текста использует grep / egrep каждый раз? ,пример
Скажем, мы делаем следующий скрипт оболочки.
В результате этого файла:
Который содержит следующий тип контента:
Теперь, когда вы запустите это, используя ту же технику выше
strace
:Вы заметите, что файл читается с шагом 8 КБ, поэтому Bash и другие оболочки, скорее всего, не будут загружать файл целиком, а считывают его блоками.
Ссылки
источник
Это больше зависит от оболочки, чем от ОС.
В зависимости от версии,
ksh
читайте скрипт по требованию размером 8 или 64 КБ.bash
читать сценарий построчно. Однако, учитывая, что строки фактов могут иметь произвольную длину, он каждый раз читает 8176 байт от начала следующей строки для анализа.Это для простых конструкций, то есть набора простых команд.
Если используются структурированные команды оболочки ( случай, когда принятый ответ пропущен ), например,
for/do/done
цикл,case/esac
переключатель, документ here, подоболочка, заключенная в скобки, определение функции и т. Д. И любая комбинация вышеперечисленного, интерпретаторы оболочки считывают до конца конструкции сначала убедитесь, что нет синтаксической ошибки.Это несколько неэффективно, поскольку один и тот же код может быть прочитан снова и снова большое количество раз, но смягчается тем фактом, что этот контент обычно кэшируется.
Каким бы ни был интерпретатор оболочки, очень неразумно модифицировать сценарий оболочки во время его выполнения, поскольку оболочка может свободно читать любую часть сценария, и это может привести к неожиданным синтаксическим ошибкам в случае несинхронизации.
Также обратите внимание, что bash может аварийно завершить работу с нарушением сегментации, когда он не может сохранить слишком большую конструкцию сценария, которую ksh93 может прочитать безупречно.
источник
Это зависит от того, как работает интерпретатор, выполняющий скрипт. Все, что делает ядро, - это замечает, что запускаемый файл запускается
#!
, по сути, выполняет остальную часть строки как программу и дает ему исполняемый файл в качестве аргумента. Если перечисленный там интерпретатор читает этот файл построчно (как интерактивные оболочки делают с тем, что вы печатаете), это то, что вы получаете (но структуры многострочных циклов читаются и сохраняются для повторения); если интерпретатор забрасывает файл в память, обрабатывает его (возможно, компилирует его в промежуточное представление, как это делают Perl и Pyton), то файл полностью читается перед выполнением.Если вы удалите файл между тем, файл не будет удален до тех пор, пока интерпретатор не закроет его (как обычно, файлы исчезают, когда последняя ссылка, будь то запись каталога или процесс, сохраняющий его открытым), не исчезает.
источник
Файл 'x':
Бег:
IIRC файл не удаляется, пока процесс сохраняет его открытым. Удаление просто удаляет данный DIRENT.
источник