Здравейте! Вероятно използвате блокиращ рекламите софтуер. В това няма нищо нередно, много хора го правят.

     Но за да помогнете този сайт да съществува и за да имате достъп до цялото съдържание, моля, изключете блокирането на рекламите.

  Ако не знаете как, кликнете тук

BASH howto - въведение в конзолата

feed Всичко свързано с Линукс. Новини, проблеми, въпроси.
Десктоп Линукс дистибуции, сървърни Линукс дистрибуции, Линукс дистрибуции с общо предназначение, Linux Mint, Ubuntu, Arch Linux, Mandriva, PCLinuxOS, openSUSE, Fedora, Red Hat Enterprise Linux, CentOS, Suse Linux Enterprise Server, Debian, Cross Linux from Scratch, Slackware, Gentoo. Графични среди, новини, игри, драйвъри, въпроси, десктоп, сървър, браузъри, помощ.
Нова тема Отговори
Потребителски аватар
cleaver
Ентусиаст
Ентусиаст
Мнения: 479
Регистриран: нед апр 13, 2008 19:42
Репутация: 356
пол: Мъж
Контакти:

BASH howto - въведение в конзолата

Мнение от cleaver »

КОНЗОЛА
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/
Тази команда в случая копира dir1 в директорията, написана след нея. В случая dir1 и /destination/directory/ се явяват аргументи на командата, защото показват за какво (в случая за кои директории) се отнася тя. Имаме и общо 3 опции - 2 къси и една дълга. Както виждаме в случая, възможно е две и повече къси опции да се въвеждат с едно тире, стига да няма интервал между тях. Тази част '-ri' може да се напише и така '-r -i', като всяка къса опция се въвежда със свое собствено тире. Дългата опция --verbose се въвежда с две тирета. Сега по две думи за опциите. Опцията -r ще рече 'recursive'. Тя казва на командата 'cp' да копира цялото съдържание на dir1, включително нейните поддиректории, ако има такива. Опцията -i означава 'interactive'. Това означава, че командата ще ви задава въпроси, когато не знае какво да прави (например дали да презапише съществуващ файл) и вие ще имате възможност да отговорите (обикновено чрез натискане на 'y' или 'n' за 'да' или 'не'). Опцията --verbose казва на 'cp' да изписва подробно на изхода си (обикновено екрана) какво прави. Някои опции имат къси и дълги версии, стига някоя от тях да не се дублира с друга опция. Например опцията '--verbose' може да се зададе и като '-v'.

Пътища

Тук искам да спомена някои важни неща за работата с пътища в 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
В този случай пренасочваме (посредством '<') файла textfile към входа на команда grep и тя се изпълнява върху него (търсейки редове, съдържащи 'string'), вместо върху стандартния вход от клавиатурата.
Сега нека си представим, че искаме да изведем списък с всички файлове в текущата директория с ls и след това в този списък да потърсим всички файлове, завършващи на .jpg с помощта на grep. Можем да го направим така:

Код: Избери всички

ls -l > filelist
grep "jpg$" < filelist               # в случая символът $ означава, че търсим стринга в края на реда
Но можем да постигнем същия резултат по-бързо и без да създаваме файла filelist, като обединим двете команди ls и grep в една посредством символа |. Този символ ви позволява обедините произволен брой команди, като подавате изхода на предходната към входа на следващата и по този начин да образувате своеобразна "верига" от команди, които заедно изпълняват по-сложни операции. Ако се върнем на предишния пример, можем да постигнем същото нещо, като избегнем създаването на междинния файл filelist по следния начин:

Код: Избери всички

ls -l | grep "jpg$"
Командата ls -l изготвя списък на файловете и папките в текущата директория, но вместо да го изведе на екрана (stdout), или да го запише във файл посредством '>', тя директно го подава на втората команда grep, която го приема като свой вход, обработва го (търси в него стринга jpg накрая на ред) и на свой ред извежда на екрана крайния филтриран резултат.
Ако продължим в същия ред на мисли, можем да комбинираме няколко команди с помощта на различни оператори за вход/изход, за да постигнем желания от нас ефект. Например:

Код: Избери всички

ls -l | grep "jpg$" | sort > sortedfilelist
Както може би вече се досещате, с тази поредица от команди отсяваме всички jpg картинки от списъка с файлове, сортираме ги по азбучен ред и записваме така изготвения списък от картинки във файл с името sortedfilelist.
Какво правим, ако поискаме да оставим дадена команда да изведе изхода си на екрана, но в същото време да запише изхода и във файл? Тук не можем да използваме оператора '>', защото той просто ще премести изхода от екрана към файл. Затова на помощ ни идва командата tee. Тя копира стандартния изход (екрана) във файл, като в същото време го оставя и на екрана. За илюстрация можем да използваме следния пример:

Код: Избери всички

ls -l | tee filelist
Тази поредица от команди ще изведе на екрана списък с файлове и папки и ще създаде файл filelist, който съдържа същия списък.
Операторът '>', който вече разгледахме, пренасочва стандартния изход (stdout) към файл. Обаче освен stdout всяка програма има отделен, независим от stdout изходен поток, в който отиват само съобщения за грешки и други съобщения с висок приоритет. Този изход се нарича изход за грешки или stderr. На пръв поглед не можем да различим stderr от stdout, защото по подразбиране и двата потока отиват на екрана на монитора. Обаче посредством оператора '>' можем да ги разделим, защото този оператор пренасочва само stdout и не влияе по никакъв начин на stderr. И ако изходът на нашата програма съдържа съобщения за грешки, които са част от stderr, те ще си останат на екрана, независимо че сме пренасочили stdout към файл посредством '>'. Ако все пак искаме да пренасочим специално stderr към файл, можем да го направим посредством оператора за пренасочване на stderr - '2>'. Този оператор пренасочва към файл само изхода за грешки и не оказва влияние върху стандартния изход stdout. Например следната команда ще пренасочи всички грешки от изхода към файла error и ще остави на екрана останалата част от изхода:

Код: Избери всички

find /home/user -iname "*blabla*" 2> error
Ако обаче искаме да пренасочим абсолютно целия изход от дадена команда (stdout+stderr) към един единствен файл, за целта можем да използваме оператора '&>'. Този оператор обединява двата оператора > и 2>, като прихваща едновременно и двата изходящи потока stdout и stderr и ги праща заедно към файл, като не оставя нищо на екрана.

По-важни команди

След като изяснихме някои основни принципи на 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 - променя права на файлове и директории.
Прочетено: 4730 пъти
Потребителски аватар
akon
Почетен член
Почетен член
Мнения: 1953
Регистриран: вт дек 18, 2007 19:57
Репутация: 140
пол: Мъж

Re: BASH howto - въведение в конзолата

Мнение от akon »

:salute: :salute: :salute: :hello1: :hello1: :hello1: =D> =D> =D> \:D/ \:D/ \:D/ :thumbright: :съгласен:
Потребителски аватар
cleaver
Ентусиаст
Ентусиаст
Мнения: 479
Регистриран: нед апр 13, 2008 19:42
Репутация: 356
пол: Мъж
Контакти:

Re: BASH howto - въведение в конзолата

Мнение от cleaver »

Благодаря, колега. :oops:
Потребителски аватар
Mozo
Skynet Cyber Unit
Skynet Cyber Unit
Мнения: 283157
Регистриран: пет юни 01, 2007 14:18
Репутация: 332702
Местоположение: Somewhere In Time

Re: BASH howto - въведение в конзолата

Мнение от Mozo »

Страхотна тема, Клийв :cheers1:
Изображение
tolostoi
Пристрастéн
Пристрастéн
Мнения: 740
Регистриран: пон апр 14, 2008 11:00
Репутация: 451
пол: Мъж

Re: BASH howto - въведение в конзолата

Мнение от tolostoi »

Еййй Мозо, към 4 години ти трябваха да я прочетеш, деа. За мен още има шанс :evil4:
Потребителски аватар
cleaver
Ентусиаст
Ентусиаст
Мнения: 479
Регистриран: нед апр 13, 2008 19:42
Репутация: 356
пол: Мъж
Контакти:

Re: BASH howto - въведение в конзолата

Мнение от cleaver »

tolostoi написа:Еййй Мозо, към 4 години ти трябваха да я прочетеш, деа. За мен още има шанс :evil4:
Тебе не ти требе, баце. Тебе ще те местиме в курса за напреднали. :lol:
Потребителски аватар
evgeny81
Начинаещ
Мнения: 105
Регистриран: съб май 28, 2011 00:59
Репутация: 58
пол: Мъж

Re: BASH howto - въведение в конзолата

Мнение от evgeny81 »

Браво страхотна тема :clap: :clap: :clap:
Нова тема Отговори

Върни се в “Линукс - инсталация, настройки, проблеми”