Лекция 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 – bash е команден интерпретатор съвместим с шела sh. Той може да изпълнява команди, както от ред, така и от файл. Bash притежава мощен скриптов език, чрез който може да се пишат програми, изпълнявани директно от командния интерпретатор. Освен това bash притежава и функции, които са присъщи на други командни интерпретатори като ksh и csh.
csh – това е шел, който обединява типичните функции за един команден интерпретатор като автоматично завършване на файлов имена при натискането на Tab, управление на задачите и поддръжка на история на командите със синтаксиса на C.
tcsh – подобрена версия на csh, включваща допълнително корекция на синтаксиса и др., като запазва пълна съвместимост с оригиналния csh. Повечето дистрибуции създават символична връзка csh, сочеща към tsch.
ksh – KornShell e команден интерпретатор, поддържащ собствен език за програмиране и позволява изпълнение на команда както от команден ред, така и от файл.
zsh – подобрена версия на ksh. Притежва множество предимства пред него, като функции, вградена синтактична проверка. За разлика от tcsh и csh, то zsh не е напълно съвместим с ksh.
Повечето от изброените командни интерпретатори (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 са:
-r, --restricted – указва на шела да влезе в ограничен режим. В този режим на потребителя са забранени следните операции: промяната на директории с командата cd; промяна на променливите на обкръжението SHELL, PATH, ENV и BASH_ENV; изпълнението на команди съдържащи знака /; задаването на / като аргумент на вградената команда .; задаване на файл съдържащ / като аргумент на вградената команда hash; импортиране на дефиниции на функции при стартиране; пренасочване на изхода с >, >|, <>, >& и >>; изпълнението на командата exec; изключване на режима на ограничения чрез командите set +r или set +o restricted. Освен по този начин режима на ограничения може да се включи и чрез изпълнението на rbash.
-rcfile file – изпълнява командите от файла, вместо от стандартния .bashrc.
Всички командни интерпретатори има множество променливи на обкръжението. Тези променливи описват различни характеристики на системата. Те се четат от останалите програми, които ги използват за настройка на вътрешните си параметри, като език на интерфейса, локализация, тип на системата, версия на операционната система, текуща директория и др. Bash притежава множество променливи на обкръжението, по-важните от които са:
BASH – указва пълното име на файла използвано за извикването на това копие на bash.
BASH_VESRION – показва версията на командния интерпретатор.
GROUPS – показва списък с групите на които е член потребителя.
HOSTNAME – показва името на компютъра.
OSTYPE – показва на каква операционна система се изпълнява копието на bash
PWD – показва текущата директория
RANDOM – при всяко извикване този параметър се променя от 1 до 32767 по случаен признак.
UID – показва уникалния идентификационен номер на потребителя, който е стартирал копието на bash.
HISTFILE – дефинира и показва файла в който се съхраняват изпълнените команди. По подразбиране това е ~/.bash_history.
HISTSIZE – дефинира и показва максималното количество реда, които може да се съдържат във файла с историята на командите.
HOME – дефинира и показва домашната директория на потребителя.
LANG – дефинира локала на операционната система за всички категории. Отделните категории може да са различни от този параметър.
LC_MESSAGES – дефинира езика на който да се показват различните съобщения.
PATH – показва и дефинира пътя в който се търсят командите.
Четенето на тези променливи може да стане с командата 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.
Писането на шел скриптове е една от трудните аспекти на Линукс, но тяхното разбиране би довело до пълен контрол върху системата чрез прост набор от предварително написани скриптове.