LINUX.ORG.RU

Если ты задаешься таким вопросом - то тебе не нужен писать свой shell. Лучше напиши очередной плеер.

По сабжу - а если подумать? Читаешь строку, парсишь, выполняешь какое-то действие.

Zhbert ★★★★★ ()
Ответ на: комментарий от x3al

Если ответишь на вопрос — придумай синтаксис.

x3al ★★★★★ ()
Ответ на: комментарий от x3al

>Зачем?

Кстати да, сначала надо самому себе ответить на вопрос - а зачем оно?

Zhbert ★★★★★ ()
Ответ на: комментарий от wlan

> Начать с чтения сорцов любого интерпретатора?
Вдруг он собирается писать интерпретатор на интерпретаторе(bash)? и с C не знаком.

tn1 ()

>> Как он работает?
Развернутый ответ доступен в исходных кодах тыщ опенсорсовых интерпретаторов.

JN ()

Я сейчас не говорю про скриптинг. Как мне ее воткнуть вместо баша, например? Понятно, что он выполняет команды которые находятся в /bin, /user/bin... Да, и нужно придумать синтаксис скрипта, чтобы парсер его потом переводил.

Phaser ()
Ответ на: комментарий от tn1

> Вдруг он собирается писать интерпретатор на интерпретаторе(bash)? и с C не знаком.
Понятно, что на компилируемом языке.

Phaser ()
Ответ на: комментарий от tn1

>Вдруг он собирается писать интерпретатор на интерпретаторе(bash)? и с C не знаком.

Ненуачо, написать интерпретатор на питоне, придумать свой синтаксис, в принципе равный синтаксису питона, только чуть другой. Читать, парсить, запускать аналогочиные функции. Дениска Попов отдыхает!

Zhbert ★★★★★ ()
Ответ на: комментарий от Phaser

>Как мне ее воткнуть вместо баша, например?
man chsh

Понятно, что он выполняет команды которые находятся в /bin, /user/bin..

Неочевидно. Ты можешь и не парсить $PATH и вообще забить на него, если у тебя есть уважительная причина делать так.

x3al ★★★★★ ()
Ответ на: комментарий от x3al

> man chsh
Ты думаешь я не знаю. Ты сам толком скажи как работает интерпретатор, а не тычь меня в исходники и маны. Нехер сказать, чего тогда пришел?

Phaser ()
Ответ на: комментарий от Phaser

>Ты сам толком скажи как работает интерпретатор, а не тычь меня в исходники и маны
Лол.
Читает строку (если не хочется велосипедить readline). Разбирает синтаксис. Выполняет встроенные функции. Если в синтаксисе шелла предполагается «всё, что не встроено — внешняя команда» (как правило), то запустить команду (с раскрытием $PATH). Организует межпроцессное взаимодействие (пайпы).

x3al ★★★★★ ()
Ответ на: комментарий от x3al

Если я напишу простой интерпретатор на С++. Который просто выполняет команды из /usr/bin типо mc,htop,ls самый примитивный. Он встанет через chsh?

Phaser ()
Ответ на: комментарий от tn1

Он спросил _как_ он работает. Вдумчивое чтение исходников этому поможет.

wlan ★★ ()
Ответ на: комментарий от tn1

supershell 2.0

и синтаксис тотже.

#!/bin/sh
while read i; do
	i=`echo $i|sed 's/L/\|less/g'`
	eval "$i";
done

Теперь мой supershell умеет глобальный алиас (почти как zsh!). L пайпает всё, что до него, через less. В версии 4.0 запилю киллерфичу — команду alias с ключом -g и хранением глобальных алиасов в отдельном файле. Даёшь возможности zsh в posix shell!

x3al ★★★★★ ()

>Вот, если я возьмусь писать свой shell, с чего начать?

Начать с того, что отказаться от идеи писать свой shell, а влиться в багзиллу любого интересующего, чтобы фиксить баги и добавлять фичи. Уже сотни людей проделали огромную работу (ты только представь себе количество человеко-часов!). Будь мужиком и рациональным! Получи удовольствие от работы в коллективе! :)

Как он работает?

Взять любой шелл и посмотреть исходники. dash из Debian, например. Да какой хочешь.

Zubok ★★★★★ ()
Ответ на: комментарий от Phaser

Скорость — побочное свойство. Шелл выбирают по синтаксису (в первую очередь извращенцы, предпочитающие *csh, в запущенных случаях — тиклешеллы, в особо запущенных — rc, es, kes) или исходя из ограничений (busybox, BSD-шеллы).

x3al ★★★★★ ()
Ответ на: комментарий от Phaser

>Я хотел самый быстрый шелл забацать :)

Ну так ищи самый быстрый UNIX-shell и смотри в него. Можешь сделать его еще быстрее, если захочешь. Нафига время-то свое изводить впустую? :)

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

> Нафига время-то свое изводить впустую?
Чтобы потом горько об этом пожалеть.

Phaser ()

Lorchanko всё сказал

тебе же адекватный человек всё правильно сказал: читай таненбаума

d ★★★★ ()

Можно почитать Кнута, придумать свой язык программирования и на нем что-нибудь написать :)

Eddy_Em ☆☆☆☆☆ ()

Сидит и ждёт, пока в stdin не появятся какие-то байтики. Как только появились - он их парсит. И в зависимости от того, что он там напарсит, делает соответсвующие вещи. Например загружает какой-то /usr/bin/cat и ждёт пока тот не сдохнет. Как только сдох - опять ждёт байтики в stdin. Если распарсить не получатся - на юзера матюком тогда: «Юзер, я не понял, чё за фигня?!».

Вот собственно и всё.

mi_estas ()

Примерно так: жжжжж…

А если чуть серьёзнее, то читает стандартный ввод и разбирает всё что с него приходит до тех пор пока не получится либо некий statement, либо какая-то лажа. В первом случае рисует на основе statement'а дерево и сворачивает его (при этом совершая какаие-то действия над окружающим миром и памятью), во втором — падает с грохотом. К этому ещё следует добавить gc на счётчиках ссылок или регионах по вкусу.

KblCb ★★★★★ ()

Вот, если я возьмусь писать свой shell, с чего начать? Как он работает?

если имеется в виду именно командная оболочка - для ЧСВ попробуй реализовать конвееры. Если кажется тривиальным, то см http://en.wikipedia.org/wiki/Hartmann_pipeline и далее http://en.wikipedia.org/wiki/Flow-Based_Programming забористо и ново.

если просто начать разобрираться как работает интерпретатор, то я бы советовал начать с внутренностей tcl - они очень просты и стиль проектирования и кода на хорошем уровне.

MKuznetsov ★★★★★ ()

>с чего начать? Как он работает?

С осиливания какой нибудь приличной книжки, вроде Design and Implementation of 4.4BSD МакКьюсака, где в начале немного объясняется, как работают интерпретаторы в плане процессов и их взаимодействия.

Ну и потом ДрегонБук - командный язык же надо реализовать.

yoghurt ★★★★★ ()

Еще можешь посмотреть в сторону Linux Application Development, Michael K. Johnson, Erik W. Troan. Там они таки осуществляют мечту, подобную твоей-пишут небольшой интерпретатор на C

anonymous ()

кстати, да, написать интерпретатор баша на баше --- это такой дзен.

dmn ()
Ответ на: комментарий от Phaser

> Я хотел самый быстрый шелл забацать :)

O_O быстрее С? С распаралеливанием на БлюДжин или Ломоносове??? Хочу Вас огорчить - скорость работы шелла значения вообще не имеет, он не применяется в задачах где скорость критична. Все равно все упрется в производительность диска...

А так... делаете семейство классов, строите из их экземпляров дерево реализующее конечный автомат и вперед... что может быть проще?

AIv ★★★★★ ()

Не мелочись. Надо хотя бы свой компилятор C написать.

fang ()

>с чего начать?

Для начала - обучиться базовой работе в Linux, использованию sh, структуре каталогов, знать основные конфиг-файлы.

Потом - научиться гуглить.

Потом узнать, что шелл пользователя задается в /etc/passwd

drakmail ★★★★ ()
Ответ на: комментарий от Phaser

Кстати, могу заметить, что Вашего уровня явно не хватит для написания юзабельного шела.

drakmail ★★★★ ()

См главу «Простой интерпретатор команд» здесь.

ugoday ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.