Лекция 5

Описание на командния интерпретатор. Видове командни интерпретатори.


В тази лекция ще разгледаме няколко основни терминологични термина, които стоят в основата на всяка Linux и UNIX система.

Първото от тях е понятието конзола. Това е исторически термин зад който стои дългогодишната история на компютъра въобще. В началото под конзола се е разбирало терминала на който е стоял администратора на машината и на който са излизали системните съобщения. Най-общо казано конзолата е текстово изходно устройство, което прихваща системните съобщения идващи от ядрото на операционната система или от програмата за системни съобщения. В големите компютри, конзолата най-често е била свързана със серийна връзка, работеща по стандарта RS-232 (серийния порт на компютъра). В съвременните персонални компютри под конзола се разбира монитора на компютъра. В Линукс съществува и понятието виртуална конзола, като това са шесте терминални прозореца, които може да се превключват с Alt+F1 до F6. Важно е да се отбележи, че системните съобщения излизат на първа виртуална конзола даже и никой да е логнат в нея. Типичен пример за това са системните съобщения на ядрото, които се появяват при стартирането на системата.

Друго важно понятие е терминал. Терминал с устройство (най-често хардуерно), което позволява комуникацията с компютъра. По принцип терминала е комбинация от монитор и клавиатура. Това не е така, обаче когато се говори за отдалечен терминал. Отдалечения терминал представлява специална програма съставена от клиент и сървър, чрез която потребителя може да се свързва отдалечено към компютър в който има валидно потребителско име и парола. Като за начало трябва да знаете, че най-често използваните програми са telnet и ssh.

Най-общо терминала е това което стои между потребителя и шела (командния интерпретатор). Шел се нарича програмата с помощта, на която системата комуникира с потребителя. Тя чете въведените от терминала редове и изпълнява различни операции в зависимост от това което е въведено. След това, шела се опитва да преобразува въвежданите конструкции в инструкции, които ядрото е в състояние да разбере.

Всеки потребител при логическото си включване в системата стартира свое копие на шел в паметта. Това се прави, за да може той да работи без да пречи на останалите потребители на системата.

Шела възприема всичко до първия интервал като команда, а всичко останало, като аргументи на тази команда, като аргументите също се разделят с интервали.

Всички (или поне повечето) Линукс системи имат повече от един валиден шел. Те са описани във файла /etc/shells. Той има следния прост вид:


/bin/bash

/bin/tcsh

/bin/csh

/bin/ash

/bin/ksh

/bin/zsh

/bin/rbash


Линукс система може да има повече инсталирани командни интерпретатори, но те са недостъпни за използване ако не са описани в този файл. Всеки потребител може да промени своя шел чрез командата chsh. Без параметри командата влиза в интерактивен режим на работа, а чрез опцията -s, този режим се изключва. Формата на командата е следния:



#chsh -s login_shell user

или само

#chsh


В някои дистрибуции е възможно проверка на валидните шелове чрез ключа -l към командата chsh, но Slackware не поддържа този ключ.

Въпреки, че съществуват множество командни интерпретатори, то не всички се използват масово. Най-често използваните командни интерпретатори са:


Повечето от изброените командни интерпретатори (bash, ksh, zsh) създават символична връзка, която започва с r и завършва с името на шела (rbash, rksh, rzsh), която указва на командния интерпретатор да превключи в защитен режим. В този режим потребителя е силно ограничен, като ограниченията зависят от конкретния шел. Описанието на restricted шеловете в /etc/shells не се препоръчва, защото след преминаване към такъв шел, потребителя не може да се върне към обичайния за него команден интерпретатор.

Най-използвания от гореизброените командни интерпретатори е bash. Той е и шела по-подразбиране в Linux. Bash е абревиатура от Bourne Again Shell, създаден от Free Software Foundation на базата на Bourne shell от UNIX™.

Всяка обвивка (обкръжение) има свои променливи на обкръжението. Техните стойности се установяват от командния интерпретатор при стартирането му и имат различни стойности за различните потребители. Ето ви още една причина за всеки потребител да се стартира отделно копие на интерпретатора. Стойностите на тези променливи могат да се променят в процеса на работа.

Например ако не ви харесва знака $ за промпт достатъчно е да смените променливата на обкръжението PS1.

Променливите на обкръжението може да се променят чрез командата:


$export PS1=%

%


само за текущата сесия или чрез промяна на файла .bash_profile или само .profile, като в този случай промяната става активна след като потребителя се логне и е постоянна. Slackware използва файла .bash_profile за въвеждане на команди или настройка на bash. Този файл се зарежда винаги когато потребителя влезе в системата. По-важните опции на bash са:


Всички командни интерпретатори има множество променливи на обкръжението. Тези променливи описват различни характеристики на системата. Те се четат от останалите програми, които ги използват за настройка на вътрешните си параметри, като език на интерфейса, локализация, тип на системата, версия на операционната система, текуща директория и др. Bash притежава множество променливи на обкръжението, по-важните от които са:


Четенето на тези променливи може да стане с командата echo:


$echo $HOME

/home/dino

$


Записа на нова стойност става чрез командата export:


$export HOME=/home/ftp

$echo $HOME

/home/ftp

$


Важна особеност е това, че при четене от променливата е необходимо пред нея да се сложи знак за долар, докато при нейна промяна това не е необходимо.

Освен променливите на обкръжението, които се дефинират автоматично от командния интерпретатор, почти всички програми дефинира собствени променливи на обкръжението.

Bash притежава мощен език за програмиране, който позволява писането на скриптове за администриране на системата или за други дейности, които могат да се извършават автоматизирано. Bash скрипта може да представлява или поредица от команди поставени във файл, които се изпълняват последователно, или скрипт написан на езика на bash в който се съчетават външни команди, променливи, цикли, условия и вътрешни bash команди. Пример за прост bash скрипт е следната последователност от команди:


$cat > simple_script

echo "Building file...."

ls -l /dev > dev_list

echo "Number of files:"

wc -l dev_list

rm dev_list

echo "Exiting"

Ctrl+D

$chmod +x simple_script

$./simple_scipt

Building file....

Number of files:

2633 dev_list

Exiting

$


Тази проста поредица от команди са обединени в един текстов файл наречен шел скрипт. Този файл трябва да има права за изпълнение, за да може командния интерпретатор да го изпълни. Повечето шел скриптове обаче не са толкова прости. Примери за сложни скриптове са командите installpkg, pkgtool и т.н, които служат за добавяне, премахване или обновяване на програмите под Slackware. Чрез използването на командите kdialog и dialog на шел скриптовете може да се направи и графичен интерфейс съответно за KDE и за текстова конзола. Пример за такъв скрипт е pkgtool и netconfig.

Писането на шел скриптове е една от трудните аспекти на Линукс, но тяхното разбиране би довело до пълен контрол върху системата чрез прост набор от предварително написани скриптове.

2