Командни езици и командни интерпретатори
Командни езици и командни интерпретатори
Както при повечето интерактивни системи, традиционният потребителски интерфейс на UNIX се основава на използването на командни езици. Казано донякъде тавтологично, можем да кажем, че командният език е езикът, на който потребителят взаимодейства със системата интерактивно. Такъв език се нарича команден език, тъй като всеки ред, въведен от терминала и изпратен към системата, може да се счита за потребителска команда по отношение на системата. Едно от постиженията на ОС UNIX е, че командните езици на тази операционна система са добре дефинирани (не много добър български термин, отговарящ на напълно еднозначния английски термин well-defined) и съдържат много функции, които ги доближават до езиците за програмиране.
Характеристика на командните езици е, че в повечето случаи те не се използват за програмиране в обичайния смисъл на думата, въпреки че всяка програма може да бъде написана на разработен команден език. Според нас правилният стил на използване на командния език е да се използва главно за директно взаимодействие със системата, като се използват възможностите за компилиране на пакетни файлове (скриптове или скриптове в терминологията на UNIX OS), за да се спестят повтарящи се рутинни процедури.
Програмите, предназначени да обработват командни езикови конструкции, се наричат командни интерпретатори. За разлика от компилираните езици за програмиране (като C или Pascal), за всеки от които обикновено има много различни компилатори, командният език обикновено е неразривно свързан със съответния интерпретатор. Когато по-долу ще говорим за различни представители на командните езици на UNIX, принадлежащи към семейството на shell,то всеки път под едно и също име ще разбираме съответния интерпретатор.
Обща характеристика на командните езици
В този раздел и по-късно в този раздел ще говорим по-конкретно за командните езици на семейството на shell. Основната цел на тези езици (има много разновидности от тях, но ние ще разгледаме само трите най-често срещани опции - Bourne-shell, C-shell и Korn-shell) е да предоставят на потребителите удобни средства за взаимодействие със системата. Какво означава това? Езиците се наричат командни езици с причина. Те имат за цел да дадат на потребителя възможността да изпълнява команди, предназначени да изпълняват определени действия на операционната система. Има два вида команди.
Командите на собствения shell (като cd, echo, exec и т.н.) се изпълняват директно от интерпретатора, т.е. тяхната семантика е вградена в съответния език. Другите имена на команди всъщност са имената на файлове, които съдържат изпълними програми. Ако се извика такава команда, интерпретаторът на командния език, използвайки съответните системни извиквания, стартира паралелен процес, в който се изпълнява желаната програма. Разбира се, значението на действието на такива команди е доста условно, тъй като зависи от конкретното съдържание на външните файлове. Въпреки това, описанието на всеки език също съдържа характеристики на "външни команди" (напр. find, grep, cc и т.н.) с очакването, че здравите потребители (и техните администратори) няма да променят съдържанието на съответните файлове.
Основен компонент на командния език са средствата, които ви позволяват да комбинирате прости команди по различни начини, образувайки съставни команди на тяхна основа. В семейството на езиците shell,следните комбинации. На един команден ред (важен термин, означаващ единица за комуникация с обвивката), можете да посочите списък с команди, които да се изпълняват последователно, или списък с команди, които да се изпълняват "паралелно" (т.е. независимо една от друга).
Много важна характеристика на семейството на езиците на shell е възможността за пренасочване на вход / изход и организиране на командни канали. Естествено, тези функции се основават на основните инструменти на UNIX OS (вижте раздел 2.1.8). Нека си припомним накратко какви са те. За всеки потребителски процес (и командите на външната обвивка се изпълняват в отделни потребителски процеси) са предварително дефинирани три специални файлови дескриптора: стандартен входен файл, стандартен изходен файл и стандартен файл за грешки. Добър стил на програмиране в среда на UNIX е всяка програма да чете своите входни данни от стандартния вход и да записва своите резултати и съобщения за грешки съответно в стандартен изход и стандартна грешка. Тъй като всеки дъщерен процес "наследява" всички отворени файлове на своя предшественик (вижте раздел 2.1.7), когато програмирате команда, се препоръчва да не мислите за източника на уводната информация на програмата, както и за конкретния ресурс, който поддържа извеждането на основни съобщения и съобщения за грешки. Просто трябва да използвате стандартните файлове, които са специално дефинирани от родителския процес (имайте предвид, че по подразбиране и трите файла съответстват на входа и изхода на терминала, от който работи потребителят).
Какво дава такава дисциплина на работа? На първо място, умението да създавашпрограми, които са "неутрални" по отношение на източника на техните входове и дестинацията на техните изходи. Всъщност принципите на I / O пренасочване и организация на командния конвейер се основават на това. Всичко е много просто. Ако напишете конструкцията на командния ред
com1 par1, par2, . parn> име на файл ,
това означава, че стандартният изход на командата com1 ще използва файла с име file_name. Ако пишете