Как Linux имеет дело со сценариями оболочки?

ldd хорошее начало. Затем Вы могли прокрутить двоичный файл strace -fo /tmp/strace.log, и взгляните там, для какого приложение пытается найти.

Запустите с a grep из ENOENT видеть то, что это не находит.

Можно также взглянуть на документацию, поставленную с тем приложением и возможно его синхронными журналами если таковые имеются.

22
23.03.2014, 16:32
4 ответа
[112378] Если вы используете [112867] strace[112868], вы можете увидеть, как выполняется скрипт оболочки, когда он выполняется.
  • Пример
  • Скажем, у меня есть этот скрипт оболочки.
  • Выполнение его с помощью [112869]strace[112870]:

    Взглянув внутрь файла [112871]strace.log[112872], мы видим следующее.

    Как только файл прочитан, он выполняется:

    В вышеприведенном примере мы ясно видим, что весь сценарий считывается как единая сущность, а затем выполняется там же. Поэтому [112873] "появляется"[112874], по крайней мере, в случае Бэша, когда он считывает файл, а затем выполняет его. Значит, вы думаете, что сможете редактировать скрипт во время его выполнения?

    ПРИМЕЧАНИЕ:[112876] Не надо! Читайте дальше, чтобы понять, почему вы не должны связываться с запущенным файлом скрипта.

    А как насчёт других интерпретаторов?

    Но ваш вопрос слегка выключен. Не Linux обязательно загружает содержимое файла, а интерпретатор загружает его, так что на самом деле это зависит от того, как интерпретатор реализует, загружает ли он файл целиком, блоками или строками за раз.

    Так почему мы не можем отредактировать файл?

    Если вы используете гораздо больший скрипт, вы заметите, что вышеприведенный тест немного вводит в заблуждение. На самом деле большинство интерпретаторов загружают свои файлы блоками. Это довольно стандартно для многих инструментов Unix, где они загружают блоки файла, обрабатывают его, а затем загружают другой блок. Вы можете увидеть такое поведение с помощью этого U&L Q&A, который я написал некоторое время назад относительно [112877]grep[112878], под заголовком: [112879]Сколько текста grep/egrep потребляет каждый раз?[112880].

    Пример

    Скажем, мы создадим следующий скрипт оболочки.

    Результат в этом файле:

    Который содержит следующий тип содержимого:[12169]Теперь, когда вы запустите его, используя ту же самую технику, описанную выше, с [112881]строчкой[112882]:[12170]Вы заметите, что файл считывается с шагом 8 КБ, поэтому Bash и другие оболочки, скорее всего, не будут загружать файл целиком, а будут читать его блоками. [12171]Ссылки[12172]The #! magic, подробности о механизме shebang/hash-bang на различных Unix вкусах[12173]
    33
    27.01.2020, 19:42
    [112458]Это больше зависит от оболочки, чем от операционной системы.[12192]В зависимости от версии, [112943]ksh[112944] читайте скрипт по требованию блоком 8к или 64к байт.[12193]bash[112946] читайте скрипт построчно за строкой. Однако, Поскольку строки могут иметь произвольную длину, то каждый раз от начала следующей строки до разбора считывается 8176 байт[12194]Это для простых конструкций, т.е. для набора простых команд. Если используются команды структурированной оболочки ([112947] - случай, который принято считать пропущенным[112948]), как цикл [112949]for/do/done[112950], переключатель [112951]case/esac[112952], документ здесь, подоболочка, заключенная в круглые скобки, определение функции и т.д., а также любая комбинация вышеперечисленного, интерпретаторы оболочки читают до конца конструкции, чтобы сначала убедиться, что синтаксической ошибки нет. [12196] Это несколько неэффективно, так как один и тот же код может быть прочитан снова и снова большое количество раз, но смягчается тем фактом, что это содержимое обычно кэшируется.[12197]Каким бы интерпретатором ни был shell, очень неразумно модифицировать скрипт оболочки во время его выполнения, так как shell может прочитать снова любую часть скрипта, и это может привести к неожиданным синтаксическим ошибкам, если он не синхронизирован. [12198] Заметьте также, что bash может упасть с нарушением сегментации, когда он не сможет хранить слишком большую конструкцию скрипта ksh93, которая может читаться безупречно.[112473].
    11
    27.01.2020, 19:42
    [112374] Это зависит от того, как работает интерпретатор, запускающий скрипт. Всё, что делает ядро - это замечает, что файл для выполнения начинается с [112865]#![112866], по сути, запускает оставшуюся часть строки как программу и передаёт ей в качестве аргумента исполняемый файл. Если интерпретатор, перечисленный там, читает этот файл построчно (как интерактивные оболочки делают с тем, что вы набираете), то это то, что вы получаете (но многострочные структуры цикла читаются и хранятся вокруг для повторения); если интерпретатор заталкивает файл в память, обрабатывает его (возможно, компилирует его в промежуточное представление, как это делают Perl и Pyton), то перед выполнением файл считывается полностью.

    • Если в это время файл удаляется, то он не удаляется до тех пор, пока интерпретатор не закроет его (как всегда, файлы исчезают, когда исчезает последняя ссылка, будь то запись в каталоге или процесс, сохраняющий ее открытой)[112377].
    7
    27.01.2020, 19:42
    [112424]Файл 'x':[12176]IIRC файл не удаляется до тех пор, пока процесс держит его открытым. Удаление просто удаляет данный DIRENT.[112429].
    4
    27.01.2020, 19:42

    Теги

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