copyleft cleaver all rights reserved
Конзолата е естественото средство за комуникация между човека и машината във всяка една Unix-базирана система. По-правилно е да се нарича "команден интерпретатор". С негова помощ, чрез писане на различни команди, ние управляваме компютъра. А той от своя страна говори на нас, като изписва резултатите от изпълнението на нашите команди било на екрана (в конзола), било във файл. Но за това малко по-късно. В Линукс има различни командни интерпретатори. Най-разпространеният от тях - BASH (който е и предмет на настоящата статия) в качеството си на команден интерпретатор е просто една програма, която интерпретира команди. Но освен това BASH е и мощен скриптов език, който предоставя почти неограничена гъвкавост при работа с тези команди. Както всеки друг език, така и BASH си има синтаксис, който трябва да се спазва, за да бъде това, което ние пишем, разбираемо и изпълнимо за компютъра. Така например в най-общия случай на всеки команден ред се пише по една команда, чието писане приключва с натискането на клавиша Enter и в същия този момент започва нейното изпълнение. Има обаче специални символи, които служат за управление работата на BASH и не могат да се използват направо в команди. Един от тези символи - ;, служи за разделяне на две последователни команди. Той позволява две и повече команди да се напишат на един ред, като между тях се поставя този символ. И когато след последната команда натиснем клавиша Enter, всички изброени команди се изпълняват поред. Друг специален символ - \, позволява една команда да се напише на два и повече реда. Когато този символ се постави в края на даден ред и след това се натисне Enter, това не води до изпълнение на команда, а просто поставя курсора на нов ред, където продължаваме да пишем същата команда. Когато сме готови с написването, можем да изпълним командата, като натиснем Enter без \ пред него.
Бих искал да обърна внимание на 3 много важни и основни за всеки шел символа.
Символът '~' (tilde) означава домашната директория. Така вместо '/home/myname' можем да напишем само '~', същото е.
Символът '.' (точка) означава текущата директория. С него винаги можем да я означим, без да изписваме целия път до нея.
Символът '..' (две точки) означава директорията, която съдържа текущата.
Всички файлове и директории, чиито имена започват с '.', са скрити и по подразбиране не се виждат.
Какво представляват командите?
В някои случаи това са функции, вградени в самия BASH (builtins), но много по-често това са програми, които се намират някъде по системата и просто се извикват от BASH при положение, че знае къде да ги търси. Почти всички команди в BASH имат сходен синтаксис, което улеснява тяхното научаване и използване. Всяка команда се състои от име, към нея може да се добавят опции и евентуално може да приема някакви аргументи. Някои команди допускат в синтаксиса си специални аргументи, които се наричат подкоманди. Какво представляват опциите? Има така наречените "къси опции" и "дълги опции". И двата вида се използват за добавяне на различни детайли към изпълнението на командата и позволяват да посочим конкретни специфични особености за нейното изпълнение. С опциите казваме на командата конкретни подробности, свързани с нейното изпълнение. Най-лесно е да го разберем така - всяка команда има своя функционалност и може да прави много различни неща. Именно чрез добавянето на опции към синтаксиса на командата ние посочваме кои неща да направи (и евентуално как) и кои не. Всяка команда си има специфични за нея (и точно определен брой) опции, но при всички команди синтаксисът им е един и същ. Късите опции обикновено представляват буква или къс низ, предхождани от тире, а дългите опции са низ (обикновено дума), предхождан от две последователни тирета. Аргументите на командите са нещо като променливи. В повечето случаи тяхната стойност зависи от това, което искаме да направим в момента. С тях обикновено се посочват нещата, които афектира (за които се отнася) нашата команда и какво точно касае тя. За да изясним всичко това, ще дадем просто пример с една тривиална команда за копиране на файлове и директории. Това е командата 'cp'.
Код: Избери всички
cp -ri --verbose dir1 /destination/directory/
Пътища
Тук искам да спомена някои важни неща за работата с пътища в BASH. Чрез пътищата се указва точното местоположение на даден файл или директория във файловата система. В горния пример с 'cp' обърнете внимание на втория аргумент - /destination/directory/. Тази директория е описана с така наречения абсолютен път до нея. Абсолютен е защото тръгва от корена - /. Всеки път до файл или директория, който започва с корена на файловата система, е абсолютен. И независимо къде се намираме в момента по файловата система, чрез абсолютен път винаги може да се опише точното местонахождение на всяко едно нещо във файловата система, защото тръгваме от корена и после просто минаваме по тези клони, които водят до това, което ни трябва. Обаче този начин за описване на пътища в повечето случаи е много дълъг, защото винаги тръгваме от корена, а това невинаги е необходимо. Обърнете внимание на първия аргумент в примера - dir1. Той е описан с така наречения 'относителен път'. Нарича се относителен, защото използването му зависи от това къде се намираме в момента. Както виждаме, не започва с корена (пред него няма /), защото директорията, в която се намираме в момента, играе роля на корен. Например ако абсолютният път до 'dir1' е да кажем '/usr/source/dir1', то ние трябва да се намираме в директория '/usr/source', за да укажем пътя относително, както сме направили по-горе. Ако се намирахме в директория '/usr/proba/' например, горната команда би върнала грешка, защото директория 'dir1' не се намира в 'proba', а в съседен на нея клон - 'source'. С други думи, за да можем да окажем относително пътя до даден обект във файловата система, ние трябва да се намираме на такъв клон, от който имаме пряк достъп до обекта. В противен случай трябва да окажем пътя като абсолютен, тръгвайки от истинския корен. Защото само истинският корен има достъп (първоизточник е на) всички клонове.
Вход/изход. Пренасочване.
По подразбиране почти всички команди приемат вход от клавиатурата и пращат изхода си на екрана. Това са стандартните input и output устройства. Но така е само по подразбиране. Има специални оператори, с които входът и изходът могат да се управляват и насочват. Например с команда 'ls' можем да отпечатаме съдържанието на дадена директория. Само че вместо да го гледаме на екрана, както би било по подразбиране, ние можем да пренасочим изхода от командата и да го запишем във файл. Това ще направим посредством оператора '>'. Ето пример:
Код: Избери всички
ls > list.file
Код: Избери всички
grep string < textfile
Сега нека си представим, че искаме да изведем списък с всички файлове в текущата директория с ls и след това в този списък да потърсим всички файлове, завършващи на .jpg с помощта на grep. Можем да го направим така:
Код: Избери всички
ls -l > filelist
grep "jpg$" < filelist # в случая символът $ означава, че търсим стринга в края на реда
Код: Избери всички
ls -l | grep "jpg$"
Ако продължим в същия ред на мисли, можем да комбинираме няколко команди с помощта на различни оператори за вход/изход, за да постигнем желания от нас ефект. Например:
Код: Избери всички
ls -l | grep "jpg$" | sort > sortedfilelist
Какво правим, ако поискаме да оставим дадена команда да изведе изхода си на екрана, но в същото време да запише изхода и във файл? Тук не можем да използваме оператора '>', защото той просто ще премести изхода от екрана към файл. Затова на помощ ни идва командата tee. Тя копира стандартния изход (екрана) във файл, като в същото време го оставя и на екрана. За илюстрация можем да използваме следния пример:
Код: Избери всички
ls -l | tee filelist
Операторът '>', който вече разгледахме, пренасочва стандартния изход (stdout) към файл. Обаче освен stdout всяка програма има отделен, независим от stdout изходен поток, в който отиват само съобщения за грешки и други съобщения с висок приоритет. Този изход се нарича изход за грешки или stderr. На пръв поглед не можем да различим stderr от stdout, защото по подразбиране и двата потока отиват на екрана на монитора. Обаче посредством оператора '>' можем да ги разделим, защото този оператор пренасочва само stdout и не влияе по никакъв начин на stderr. И ако изходът на нашата програма съдържа съобщения за грешки, които са част от stderr, те ще си останат на екрана, независимо че сме пренасочили stdout към файл посредством '>'. Ако все пак искаме да пренасочим специално stderr към файл, можем да го направим посредством оператора за пренасочване на stderr - '2>'. Този оператор пренасочва към файл само изхода за грешки и не оказва влияние върху стандартния изход stdout. Например следната команда ще пренасочи всички грешки от изхода към файла error и ще остави на екрана останалата част от изхода:
Код: Избери всички
find /home/user -iname "*blabla*" 2> error
По-важни команди
След като изяснихме някои основни принципи на BASH, нека да разгледаме и някои от най-често използваните команди и тяхното предназначение.
1. Команди за извличане на информация.
pwd (=Print Working Directory) - показва абсолютния път до текущата директория.
hostname - показва името на локалния хост (компютъра, чийто физически терминал използваме).
whoami - изписва името на текущия потребител (този, който въвежда командата).
date - показва и/или променя текущия час и дата.
time - в комбинация с някоя друга команда след нея показва за колко време се изпълнява дадената команда.
who - показва кои потребители са включени в момента.
finger [user_name] - показва системна информация за даден потребител.
last - извежда хронологичен списък с потребители, които последно са се включвали в системата, както и точния час и дата на включването им.
history - показва списък с последните изпълнени от BASH команди.
uptime - показва времето, изминало от последния рестарт на системата до момента.
ps - извежда списък с процесите, управлявани от текущия терминал. Изпълнена с опция -e, показва всички процеси.
top - показва динамичен списък с активните процеси (заедно с информация за всеки от тях), както и полезна статистика и информация за системното натоварване (процесор, памет).
uname - показва името на операционната система. С опция -a, показва и версията на ядрото, името на хоста, архитектурата и пр.
free - показва информация за паметта.
df -h - показва заетото и свободното място на всяка монтирана файлова система.
du -h /dir - изчислява размера на директория, мястото, което всички поддиректории и файлове в нея заемат.
1. Базови команди.
cat - извежда съдържанието на един или повече файлове.
echo - извежда текст, който й е бил подаден като аргумент.
man - извежда подробна помощна информация за командата, която й е подадена като аргумент.
ls - извежда списък със съдържанието на текущата директория. С опция -l извежда подробен списък, с опция -a показва и скритите файлове и директории.
cd [directory] (=Change Directory) - смяна на текущата директория. Използвана без аргумент, командата връща в домашната директория.
cp [file1 file2 ...] [destination] - копира файлове. С опция -r (=recursive) копира цели директории със съдържанието им.
mv - преименува файлове и директории или ги мести от едно място на друго.
rm - изтрива един или повече файлове. С опция -r (=recursive) изтрива цели директории с тяхното съдържание.
less - с нея можете да преглеждате текстови файлове, без да ги редактирате. Удобна е за четене на големи файлове.
find / -name "filename" - търси за файлове с име "filename" в дадена директория (в случая /) и нейните поддиректории.
touch - създава празен файл, чието име се подава като аргумент на командата.
kill PID - спира процес по зададен номер на процеса. С опция -9 процесът бива убит незабавно.
killall - спира процес, чието име се подава като аргумент на командата. Важи за всички процеси с това име.
useradd - създава нов потребителски профил, чието име се подава като аргумент на командата.
userdel - изтрива потребителски профил, чието име се подава като аргумент на командата.
passwd - създава/променя паролата на потребителски профил. Всеки профил (с изключение на root) може да променя само своята парола. root може да променя паролата на всеки потребител.
chmod - променя права на файлове и директории.