Интерпретатор в программировании простыми словами

Когда вы входите в систему Unix, программа. Называемая процесс оболочки это бег за тобой. Процесс оболочки-это интерпретатор команд. Который предоставляет вам интерфейс к операционной системе. Один сценарий оболочки это просто файл команд. Обычно выполняемых процессом оболочки. Который был создан для запуска скрипта. Содержимое файла скрипта может быть просто обычными командами. Которые вводятся в командной строке. Но все стандартные интерпретаторы команд также поддерживают язык сценариев для обеспечения потока управления и других возможностей. Аналогичных тем. Которые имеются в языках высокого уровня.

Сценарии оболочки программирования для оболочки bash являются предметом данного обсуждения.

В большинстве систем Unix доступно более одного процесса оболочки. Наиболее популярными из них являются

  • Bourne shell (sh) — Unix System V (разработана Стивом Борном в Bell Laboratories;
  • C shell (csh) — Berkeley Unix; так известно. Потому что это команды C like (созданные как альтернатива
  • Korn shell (ksh) — расширяет Bourne shell (разработано Дэвидом Корном в Bell Laboratories. Сайты часто имеют версию 1988 года. А не версию 1993 года)
  • GNU Bourne-Again SHell (bash) — расширяет оболочку Bourne. А также имеет функции из оболочки Korn
  • Z shell (zsh) — разработан Полом Фальстадом из Принстона; суперсеть оболочки Korn. С добавленными функциями C shell
  • Enhanced C shell (tcsh) — расширение C shell [примечание: есть сильные разногласия относительно C shell (Csh Программирование считается вредным

Вы можете определить. Какую оболочку вы запускаете. Выполнив (процесс сtatus) команда; скорее всего. Вы будете использовать оболочку bash (информация о состоянии будет помечена удар). Вы можете запустить любую оболочку. Поддерживаемую вашей системой. Если, например. Ваша система поддерживает оболочку Korn. Любой сценарий оболочки Korn можно запустить из командной строки, введя

кш

хотя, вероятно. Целесообразно изучить язык скриптов для оболочки. Которую вы хотите обычно использовать. Вы обнаружите. Что между часто используемыми оболочками больше сходств. Чем различий.

В некоторых системах

вам может быть доступна команда изменить оболочку входа для вашего имени пользователя. То чшш команда сообщает вам текущую оболочку входа в систему. А затем запрашивает новую. Новая оболочка входа в систему должна быть одной из утвержденных оболочек. Перечисленных в /etc/оболочки файл (если у вас есть права суперпользователя. Вы, конечно. Можете использовать какую-то оболочку собственного создания).

Вы можете запустить любую из этих оболочек из своей оболочки входа в систему; например,

помещает вас в оболочку Обычно

выход

команда завершит оболочку. В которой вы находитесь. Независимо от вкуса.

Строка командной строки обычно настраивается так. Чтобы указать. Какую оболочку вы используете. Для оболочки C индикатор представляет собой a % символ; для bash и оболочки Korn это $ символ. Если вы задаете свою собственную строку командной строки с помощью сценария запуска оболочки. Рекомендуется добавить символ командной строки по умолчанию в конец строки в качестве визуальной ссылки. Для которой оболочка активна. Поскольку каждая оболочка имеет свои собственные характеристики.

Важно помнить. Что оболочка-это программа. Которая принимает строки текста ASCII по одной за раз и интерпретирует их. Независимо от того. Введены ли они по одному из командной строки или по одному из файла скрипта. Более того, это означает. Что каждая строка файла скрипта должна иметь интерпретацию. Переменные оболочки служат в качестве текстовых хранилищ. Что означает. Что числовая обработка требует специальной обработки.

Оболочка позволяет создавать сложные конструкции. Которые трудно точно повторить. Что делает их естественными кандидатами для простых сценариев. Такие конструкции обычно возникают в контексте перенаправления. Труб и фильтров.

  1. Перенаправление терминального ввода-Вывода

    Независимо от того. Какие другие файлы открываются. Всякий раз. Когда выполняется команда оболочки. Открываются три стандартных файловых потока:

    • «стандарт в
    • «стандартный выходстандартная ошибка— для вывода.

    [для программирования на языке Си они упоминаются как stdin, stdout, и stderr, соответственно]. Если не указано иное. Оболочка назначает эти потоки пользовательскому терминалу.

    Функция оболочки. Известная как перенаправление используется для назначения файлов. Отличных от пользовательского терминала. Стандартному потоку. Форматы для перенаправления следующие:

    [
     
    [
     
    [
     

    Чтобы проиллюстрировать простое перенаправление, вспомним. Что команда shell сортировать без аргумента принимает свои входные данные из стандартного ввода и иным образом объединяет и сортирует список представленных ему файлов. Так что если вы просто войдете

    сортировать

    в командной строке каждый последующий строчный ввод с терминала подается в сортировать до тех пор. Пока вы не войдете в EOF (

  2. Трубы

    Перенаправление включает в себя предоставление команды оболочки с альтернативой пользовательскому терминалу для стандартного ввода. Стандартного вывода или стандартной ошибки. Вы не можете взять стандартный вывод и превратить его непосредственно в стандартный ввод для другой команды. Не пройдя через промежуточный файл; например. Намерение сделать сортировка

    ls -l
    сортировать

    Чтобы обойти эту необходимость в передаче данных через временные файлы. Оболочка предоставляет средство получения стандартного вывода из одной команды и делает его стандартным вводом для другой. Это называется труба Обозначение

    используется для обозначения того. Что стандартный вывод из

  3. Фильтры

    сортировать является примером типа команды оболочки. Называемой Фильтр Фильтр-это команда. Которая берет данные из файла и выполняет над ними какое-то простое преобразование. Результат которого передается в какой-то другой файл .

    Примеры:

    • сортировать — сортировка файлов
    • grep (и его производные) — поиск информации по ключевым словам в файле
    • голова — выходные строки из передней части файла
    • хвост — выходные строки из хвостовой части файла
    • туалет — подсчет слов. Строк и/или символов в файле
    • склеп — зашифровать файл (используйте с осторожностью!)
     

    Мы уже смотрели сортировать.

    grep (global regular expression — print) — это команда оболочки. Которая сопоставляет шаблоны. Представленные ограниченными регулярными выражениями. С входным потоком символов. Связанная команда, цапля, допускает полный спектр регулярных выражений (регулярные выражения подробно рассматриваются в исследовании компиляторов). греп ограничивается теми же регулярными выражениями. Что и основной редактор Unix, ред. История (как рассказывают Керниган и Пайк) заключается в том. Что греп на самом деле был создан вечером. Сделав небольшую операцию на ред!

    Наиболее фундаментальное использование для греп это. Чтобы найти вхождения одного слова; например,

    греп -n ‘symbval’ pass2.c

    дает номера строк и печатает строки. Содержащие определенный символ симбвал«.

    Метасимволы используются для механизмов. Используемых регулярными выражениями для представления сложных шаблонов; например

    ^ для начала строки; например, ‘^t’ = строки. Начинающиеся с т«.
    $ для конца строки; например, ‘t$’ = строки. Заканчивающиеся т«.
    . соответствует любому отдельному символу; ‘^.t’ = строки с 1-м символом и 2-м символом т«.
    * идет с предыдущим символом. Чтобы представить 0 или более повторений символа.
    + это как *, но для 1 или более повторений (цапля только).
    \ отключает любое специальное значение для символа. Который следует за ним.
     

    Правила построения регулярных выражений предоставляют средства для использования более простых регулярных выражений для определения более сложных регулярных выражений; например,

    [] совпадение-это регулярное выражение: совпадение относится к любому перечисленному символу; допускает такие диапазоны, как а-х.
    [^] not match — это регулярное выражение: match-это любой символ. Не указанный в списке; также допускает диапазоны.
    (
     

    Вы могли бы почти пойти в школу на grep Например. Вот типичная запись из файла системного пароля /etc/passwd

    imauser:x:121:101:Ima User:/home/imauser:/bin/ksh

    Следующая команда оболочки ищет в этом файле пользователей без паролей:

    греп -n ‘^[^:]*::’ /etc/passwd

    Узор ^[^:]*:: является сопоставлением регулярных выражений и интерпретируется следующим образом:

    Совпадение паттернов требует начала (^), состоящие из символов, не являющихся :— характер ([^:]), 0 или более из них (*), а затем два :::).
     

    Другими словами. Чтобы соответствовать этому шаблону. Запись может иметь любое количество символов до первого ::

    Примечание: крайне маловероятно. Что системное администрирование разрешит учетные записи без паролей; обратите внимание, что. Хотя файл паролей полностью доступен (он должен быть). Шифрование защищает пароли. Если два пользователя должны использовать один и тот же пароль. Процедура шифрования будет шифровать их по-разному. Поскольку существуют методы дешифровки. Способные взломать пароли. Если дать им достаточно времени. Лучший совет-регулярно менять пароль.

    Конструкция фильтра

    голова -15 myfile

    перечисляет первые 15 строк myfile и

    хвост -15 myfile

    перечисляет последние 15 строк.

    Если номер не указан. Значение по умолчанию равно 10.

    Конструкция фильтра

    туалет -lwc myfile

    подсчитывает строки. Слова и символы в файле.

    Если кто-либо из л, w, или с опущено. Что счет не предусмотрен.

    Конструкция фильтра

    склеп

    входные myfile и шифрует его с помощью прилагаемого

  4. Программирование оболочки

    Оболочка на самом деле гораздо больше. Чем просто пользовательский интерфейс. Так как она включает в себя язык программирования. Язык программирования для оболочки достаточно сложен. Чтобы обрабатывать многие виды вещей. Которые в противном случае могли бы быть сделаны на таком языке. Как C. Но, напротив. Является интерпретирующим. А не компилируемым. Основные добродетели заключаются в том, что

    • программы оболочки предоставляют средства для инкапсуляции групп команд оболочки. Которые должны быть выполнены;
    • системное администрирование имеет много функций. Лучше всего описанных с использованием логики принятия решений языка программирования (более того. Интерпретирующий код будет портироваться (так как это просто текст). В то время как скомпилированный код не будет);
    • часто бывает проще выполнить системную функцию в оболочке. Используя возможности программирования оболочки (в конце концов. Это часть операционной системы). Чем написать высокоуровневую языковую программу для той же цели.
     

    В самом простом случае сценарий оболочки (программа. Написанная на языке программирования оболочки) — это всего лишь одна или несколько команд оболочки. Которые вы вводите в командной строке Unix. Например, если вы создадите файл с именем флист содержание которого состоит из

    ls -l | сортировать | Меньше

    затем выполнение

    ш флист

    выполнит сценарий оболочки. Запустив командную строку так. Как если бы она пришла с клавиатуры. В этом смысле это похоже на нажатие клавиш макросы

    Для оболочки bash. Если первая строка Пользователи это строка комментария

    #!/bin/bash

    и выполнить разрешение на флист был включен с помощью команды shell чмод тогда скрипт можно выполнить просто введя

    флист

    в командной строке (при условии. Что . находится в ПУТЬ переменная). Это также будет работать для других оболочек. Пока первая строка идентифицирует используемую оболочку.

    Скрипты оболочки часто используются для захвата в более простом синтаксисе результата чего-то трудного для запоминания. Для этого обстоятельства полезно иметь возможность передавать аргументы в скрипт оболочки. Они упоминаются внутри скрипта как позиционные параметры $1, $2, $3, . . . . Например, мы могли бы захотеть захватить sed процедура отступа файла таким образом; т. Е. сценарий оболочки табин может просто состоять из

    #!/bin/bash
    sed$1

    Как и в любом другом языке программирования. Сила языка программирования оболочки заключается в способности использовать логику принятия решений для определения поведения сценария оболочки. Конструкции. Используемые для этой цели. Аналогичны конструкциям стандартных языков. Таких как C. Они включают в себя if-then-elsecaseforwhileuntilКонтроль структур-это одна из областей. Где есть существенные различия между оболочками. Хотя и есть значительное сходство. Наше внимание сосредоточено на оболочке bash. Которая является продолжением оболочек Bourne и Korn и которая также предоставляет возможности. Выходящие за рамки оболочки C.

  5. если-то, если-то-еще. Если-то-элиф-то-еще строительство
    если

    То elif часть может быть опущена. Если требуется строго структура То ещё часть также может быть опущена. Чтобы получить строго конструкцию

    Пример конструкции if-then-elif-then-else:

    эхо -n Читать Имя
    если [ $имя = ]
      затем эхо
    elif [ $имя = ]
      затем эхо
    ещё
      эхо
    fi

    «[]Обратите внимание. Что команды должны быть отделены от своих аргументов одним или несколькими пробелами. Поэтому пробел должен следовать []$name = , кавычки на самом деле не нужны для этого конкретного примера. Но включены. Потому что они необходимы в более сложных случаях. Которые являются сравнениями текста. Вокруг нужны пространства = = -eq — для цифр. !

    [ ! $имя = -если … ]

    Проверка состояния соединения может быть создан с помощью И/ИЛИ комбинаций. Где &&— это И есть и ||

    [ ! $имя = && [ $имя > ]

    образует тест Существуют и другие условные тесты (числовые, файлы). Которые будут использованы позже. Но не будут рассмотрены подробно.

  6. дело Строительство
    дело

    Пример построения кейса:

    эхо -n Читать Имя
    дело в
    Билл)
        эхо
        ;;
    Алиса)
        эхо
        ;;
      *)
        эхо — для этого дела нет оснований
        ;;
    esac

    Идентификатор для каждого случая должен быть в своей собственной строке. И каждый случай завершается. Когда двойной ;— встречается.

  7. Петлевые Конструкции
    • для петля

      для

      Пример построения цикла for:

      Список=-пункт 1 пункт 2 пункт 3
      для Имя в $список
      делать
      эхо
      Выполнено

      Если в предложение опущено. Используемый список-это список параметров. Передаваемых скрипту при его вызове.

    • пока петля

      пока

      Пример построения цикла while:

      ans=
      пока [ ! $ans = ]
      делать
      эхо
      эхо -н
      Читать ans
      Выполнено

      То эхо чтобы подавить новую строку. Которую он в противном случае выдал бы по возвращении.

      Оболочка bash также поддерживает до тех пор петли. Которые отличаются от пока циклы только в том случае. Если проверка состояния не выполняется до тех пор. Пока тело цикла не будет обработано один раз.

    Единственная другая заметная структура принятия решений для оболочки bash — это расширение структуры case, называемое выбирать структура. Которую мы здесь не будем рассматривать.

    Пока вы помните. Что представляет собой команда оболочки. Вы можете поместить структуры (кроме дело) в одной строке с помощью ;

    если

    это то же самое. Что и сценарий

    если
    затем
        
    fi

    за исключением того. Что все это на одной линии.

  8. Пример: Разработка полезного скрипта

    Предположим. Что для процессора SIC/XE у вас есть программа-симулятор с именем сиксим и кросс-ассемблер по имени сиказм Процесс сборки программы для процессора SIC/XE и запуска на симуляторе утомителен. Поэтому вам нужна оболочка скриптов для автоматизации этого 2-шагового процесса.

    1. сборка программы SIC/XE
    2. передача объектного файла в симулятор SIC в качестве устройства ввода DEVF1.

    В качестве первой попытки вы могли бы это сделать:

    #!/бин/Баш

    sicasm $1

    СР $1.параметр obj DEVF1

    Эхо
    sicsim

    Это имеет очевидную слабость-не проверять. Ввел ли пользователь какой-либо параметр. Переменная оболочки $# подсчитывает количество позиционных параметров. Поэтому if можно проверить. Не равно ли оно нулю. 2-я версия скрипта. Чтобы воспользоваться этим преимуществом. Может быть:

    #!/bin/bash

    если [ $# -eq 0 ]

    exit 1
    fi

    sicasm $1

    cp $1.obj DEVF1

    echo
    sicsim

    Следующим преимуществом было бы определить. Существует ли предоставленный файл на самом деле. Оболочка Bourne (и. Как следствие. Bash) имеет команду тест— это может проверить условия. Касающиеся файлов. Под оболочкой баша, тест
    [

    3-я версия скрипта. Использующая эту возможность. Задается следующим образом:


    #!/bin/bash

    if [ $# -eq 0 ]

    exit 1
    fi


    если [ ! -e $1]
    , то echo
    exit 1
    else

    sicasm $1

    cp $1.obj DEVF1

    echo
    sicsim
    fi

    Следует отметить пробелы вокруг элементов. Используемых в тесте if.

    Что делать, если сборка не удалась? Было бы желательно. Чтобы сценарий проверил это и остановился. Если это произойдет. Как и следовало ожидать. Если сборка не удалась, сиказм возвращает ненулевое значение код выхода. Переменная оболочки $? имеет код выхода для последней выполненной команды.

    4-е усовершенствование скрипта иллюстрирует. Как воспользоваться этой информацией:

    #!/Бен/Баш

    , если [ $# -экв 0 ]

    выход 1
    фи
    , если [ ! -Е $1 ]
    затем эхо
    выход 1
    еще

    sicasm $1


    if [ ! $? -eq 0 ]
    then echo
    exit 1
    fi

    cp $1.obj DEVF1

    echo
    sicsim
    fi

    5-е (и последнее) улучшение заключается в том. Чтобы приспособить такой синтаксис, как

    sicasmrun prog.sic data1.sic data2.sic

    где sicasmrun— это название сценария оболочки, prog.sic это исходный файл ассемблера. А остальные-входные файлы данных. Этой информации достаточно. Чтобы обойти команды. Используемые для настройки симулятора. Поэтому также проиллюстрирован метод отправки первых 3 команд для симулятора через сценарий оболочки. А затем позволить пользователю взять управление на себя.

    В этом случае добавленная функция заключается в последовательном копировании любых файлов данных, заданных в командной строке, в другие имена файлов (DEVF2, DEVF3,…). Распознанные симулятором.

    #!/bin/bash

    if [ $# -eq 0 ]


    выход 1
    фи
    , если [ ! -Е $1 ]
    затем эхо
    выход 1
    еще

    sicasm $1
    , Если [ ! $? -эквалайзер 0 ]
    затем Эхо
    выход 1
    фи

    СР $1.параметр obj DEVF1
    ЦНТ=2
    а [ ! $# -EQ-это 1 ]
    # сдвиг перемещает агду указатель на
    # следующий параметр (может быть
            
    сделать смену
    если [ ! -Е $1 ]
    затем эхо
    скопировать в DEVF$УНТ ***
    еще

    СР $1 Дев$УНТ
    в интернет
    пусть кол=Кол+1
    сделано


    эхо

      (echo a; echo s; echo

    fi

    Команды и конструкции. Которые не появлялись раньше. Являются частью дополнений к сценарию. Сначала команда shell сдвиг имеет эффект изменения адреса. Используемого для доступа к аргв массив. По сути переориентирующий $1 к следующему параметру при каждом вызове. Обратите внимание. Что $# соответственно уменьшается на 1 с каждым сдвигом.

    сдвиг должен использоваться с осторожностью. Так как нет Он обеспечивает способ доступа к списку параметров переменным способом и является средством доступа к более чем 9 позиционным параметрам. $10 расширяется как $1 сцеплено с 0.

    Во-вторых, команда оболочки позволять предоставляет средство для выполнения арифметики над переменными оболочки. Которые имеют значения. Которые могут быть интерпретированы как целочисленные. Эквивалентная арифметическая конструкция позволять заявление. Использованное выше,

    count=$((count+1))

    использует для вычислений более универсальную арифметическую форму. Для которой результат [$((count+1)] в равной степени может быть использован и для других целей. Кроме присвоения переменной (например. Его можно было бы повторить).

    Наконец, строительство

    (эхо один; эхо с; эхо кошка| sicsim

    пользуется тем. Что когда кошка не имеет аргументов. Которые он черпает из стандартного ввода. В результате все введенное немедленно отправляется на стандартный вывод. Напомним из обсуждения перенаправления. Что когда две команды заключены в круглые скобки. Их стандартный вывод объединяется. Так что получается. Что вывод 3 эхо команды сочетаются с командами кошка и результат передавался по трубе дальше сиксим как стандартный ввод. Эффект заключается в том. Чтобы управлять сиксим интерфейс от кошка так что он продолжает вести себя как обычно. За исключением того. Что эхо выдает первые 3 команды для сиксим а не пользователя. Другое отличие заключается в том. Что кошкасиксим также. Поскольку его стандартный ввод больше не будет действительным. Если сиксим завершается сам по себе (предположительно под контролем пользователя). Другой конец трубы будет сломан и все остальное из кошка найдет несуществующую цель. Вызвав ошибку и завершение команды. По этой причине стандартная ошибка для кошка был перенаправлен так. Что если эта ситуация действительно возникает. Это не вызывает изжоги. Для всех практических целей указанный файл /dev/null эквивалентно забвению и является тем. Что обычно используется для такого рода действий.

    Единственным другим способом выполнить эту задачу было бы изменить программу для сиксим, что поставило бы под угрозу его концептуальную целостность. Эта иллюстрация должна помочь объяснить. Почему пользователи Unix используют shell-скрипты для выполнения большей части своей работы.

  9. Отладка скрипта

    Сценарий с несколькими строками приносит с собой те же самые проблемы отладки. Которые возникают в языках программирования. Под оболочкой баша набор команда используется для включения (или выключения) функции трассировки команд. Используемой для отладки скриптов. Функция включена в скрипте. Просто добавив строку

    набор

    чтобы начать трассировку. В то время как трассировка действует. Каждая встреченная команда повторяется до стандартной ошибки перед ее выполнением. Выходные данные трассировки идентифицируются по значению переменной ключевого слова PS4+ Трассировка отключается. Когда сценарий заканчивается или когда

    набор

    исполняется.

    Как правило. Полезно установить PS4 в профиле скрипта (.bash_profile). Например,

    PS4=’+ On line $LINENO: ‘
    экспорт PS4

    предоставит номера строк для каждой отслеживаемой команды.