Giter Club home page Giter Club logo

bash's Introduction

Custom shell

Dependencies graph:

Dependencies graph

Data flow graph:

Data flow graph

Краткое описание деталей реализации:

cli.py содержит функцию run_cli(), которая получает 4 функции(выбирает реализации интерфейса):

read_command - Возвращает новую команду для исполнения () -> str

substitute - Производит замены $variable на значение variable в окружении. Сама анализирует кавычки. str -> str

tokenize - Разбивает строку на токены str -> List[str]

interpret - Запускает токенизированную команду(List[str]) и ждёт её завершения. List[str] -> Nothing

Алгоритм работы:

  1. Считать команду с помощью read_command,
  2. Сделать замены с помощью substitute,
  3. Разбить команду на токены с помощью tokenize,
  4. Запустить команду с помощью interpret

Реализация read_command сейчас считывает строку с консоли.

Реализация substitute сейчас производит замены всех $var вне строк в одинарных кавычках

Реализация tokenize сейчас использует shlex.split() для разбиения на токены

Реализация interpret:

  1. Разбить входные токены на одиночные команды(без пайпов(|))
  2. Запустить все одиночные команды, передав им в качестве stdin и stdout соответствующие анонимные пайпы.
  3. Дождаться завершения каждой команды с помощью метода .wait() у объекта, возвращенного после запуска команды. Закрыть все файловые дескрипторы, созданные для коммуникации.
  4. Считать и вывести stdout последней команды.

Запуск одиночной команды производится таким алгоритмом:

  1. Попытаться запустить команду как встроенную.
  2. Если удалось, получить поток и обернуть его своим классом, добавив метод .wait(), который дожидается завершения.
  3. Иначе запустить процесс и вернуть Popen объект, у которого есть .wait() для ожидания завершения.

По сути запуск одиночной команды возвращает какой-то объект с методом .wait() (такой интерфейс)

bash's People

Contributors

krock21 avatar

Stargazers

 avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.