Реализация простого командного интерпретатора (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- экранирование пробелов
Проект разделён на модули:
- Лексический анализ (токенизация)
- Обработка кавычек и экранирования
- Подстановка переменных окружения
- Тип данных:
TokenList(список лексем)
- Синтаксический анализ (рекурсивный спуск)
- Построение дерева команд
- Обработка операторов:
|,;,& - Тип данных:
Command(дерево команд)
- Выполнение команд
- Управление процессами (fork/exec)
- Реализация конвейеров (pipe)
- Обработка перенаправлений
- Внутренние команды
- Главный цикл shell
- Взаимодействие с пользователем
- Обработка сигналов (Ctrl+C, Ctrl+D)
- ::= <конвейер> [ (';' | '&') ]
- <конвейер> ::= <команда> [ '|' <конвейер> ]
- <команда> ::= <простая_команда> [ <перенаправление> ]
- <простая_команда> ::= <слово> { <слово> }
- <перенаправление> ::= ( '<' <слово> | '>' <слово> | '>>' <слово> ) [ <перенаправление> ]
- <слово> ::= [^|&;<>() \t\n]+ | <строка_в_кавычках>
- <строка_в_кавычках> ::= '"' [^"]* '"' | "'" [^']* "'"
<shell>- вся командная строка<конвейер>- цепочка команд через|<команда>- команда с возможными перенаправлениями<простая_команда>- имя команды и её аргументы<слово>- лексема (либо обычный текст, либо строка в кавычках)
- Наивысший: Перенаправления (
<,>,>>) - Высокий: Конвейер (
|) - Низкий: Последовательность (
;) и фон (&)
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 '>'