Skip to content

Punisher97/Task_5

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MyShell

Описание проекта

Реализация простого командного интерпретатора (shell) на языке C в рамках учебного задания по операционным системам.

Основные возможности

✅ Реализовано (обязательные требования):

  • Конвейеры (pipes): command1 | command2 | command3
  • Перенаправление ввода/вывода:
    • < file - ввод из файла
    • > file - вывод в файл (перезапись)
    • >> file - вывод в файл (добавление)
  • Фоновый режим: command &
  • Последовательное выполнение: command1; command2; command3
  • Внутренние команды:
    • cd [dir] - смена директории
    • pwd - печать текущей директории
    • exit - выход из shell
  • Подстановка переменных окружения:
    • $HOME - домашняя директория
    • $USER - имя пользователя
    • $SHELL - путь к shell
    • $EUID - эффективный UID

✅ Дополнительно (желательные требования):

  • Выполнение команд через аргументы: ./myshell "ls -la"
  • Обработка кавычек и экранирования:
    • echo "Hello World" - строки в двойных кавычках
    • echo 'test file' - строки в одинарных кавычках
    • echo test\ file - экранирование пробелов

Архитектура проекта

Проект разделён на модули:

Модуль list.c / list.h

  • Лексический анализ (токенизация)
  • Обработка кавычек и экранирования
  • Подстановка переменных окружения
  • Тип данных: TokenList (список лексем)

Модуль tree.c / tree.h

  • Синтаксический анализ (рекурсивный спуск)
  • Построение дерева команд
  • Обработка операторов: |, ;, &
  • Тип данных: Command (дерево команд)

Модуль exec.c / exec.h

  • Выполнение команд
  • Управление процессами (fork/exec)
  • Реализация конвейеров (pipe)
  • Обработка перенаправлений
  • Внутренние команды

Модуль main.c

  • Главный цикл shell
  • Взаимодействие с пользователем
  • Обработка сигналов (Ctrl+C, Ctrl+D)

Формальное описание синтаксиса (БНФ)

  • ::= <конвейер> [ (';' | '&') ]
  • <конвейер> ::= <команда> [ '|' <конвейер> ]
  • <команда> ::= <простая_команда> [ <перенаправление> ]
  • <простая_команда> ::= <слово> { <слово> }
  • <перенаправление> ::= ( '<' <слово> | '>' <слово> | '>>' <слово> ) [ <перенаправление> ]
  • <слово> ::= [^|&;<>() \t\n]+ | <строка_в_кавычках>
  • <строка_в_кавычках> ::= '"' [^"]* '"' | "'" [^']* "'"

Пояснения:

  • <shell> - вся командная строка
  • <конвейер> - цепочка команд через |
  • <команда> - команда с возможными перенаправлениями
  • <простая_команда> - имя команды и её аргументы
  • <слово> - лексема (либо обычный текст, либо строка в кавычках)

Приоритет операций:

  1. Наивысший: Перенаправления (<, >, >>)
  2. Высокий: Конвейер (|)
  3. Низкий: Последовательность (;) и фон (&)

Сборка и запуск

Сборка:

make          # Сборка проекта
make clean    # Очистка объектных файлов
make rebuild  # Полная пересборка
make run      # Запуск с rlwrap (если установлен)



Тестирование
Тесты, которые работают (корректные команды):
$ pwd
/home/user/Task_5

$ ls -la
total 48
drwxr-xr-x  2 user user  4096 Dec 13 10:30 .
drwxr-xr-x 10 user user  4096 Dec 13 09:00 ..
-rw-r--r--  1 user user  1234 Dec 13 10:30 main.c
-rw-r--r--  1 user user  5678 Dec 13 10:30 list.c
2. Конвейеры
$ ls | grep ".c"
list.c
main.c
tree.c
exec.c

$ echo "one two three" | wc -w
3. Перенаправления:
$ echo "test content" > testfile.txt
$ cat testfile.txt
test content

$ echo "more text" >> testfile.txt
$ cat < testfile.txt
test content
more text

4. Последовательности:
$ echo "first"; echo "second"; echo "third"
first
second
third

$ ls; pwd; whoami
main.c list.c tree.c exec.c Makefile
/home/user/Task_5
user
5. Фоновый режим
$ sleep 2 & echo "immediate output"
[1] 12345
immediate output

6. Внутренние команды:
$ cd ..
$ pwd
/home/user
$ cd $HOME/Task_5
$ pwd
/home/user/Task_5

7 Переменные окружения:
$ echo "Home: $HOME, User: $USER"
Home: /home/user, User: user

$ echo "Shell: $SHELL, EUID: $EUID"
Shell: /bin/bash, EUID: 1000

Ошибки:
$ | ls
Syntax error: expected command

$ ls |
Syntax error: expected command

$ > file.txt
Syntax error: expected command

$ echo test >
Syntax error: expected filename after '>'

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors