от Курс за ССОК
Лекцията запознава читателя със сищината на командния ред и много полезни команди. Включва и примери за упражнение.
Защо ни е нужен команден ред
Класическото работно място е отвратително и всеки от нас се е сблъсквал с неговите ограничения. Дълбоко е него се корени системата за избор от меню. Това е търсене на елементи в дървовидна структура, което започва да става объркващо МНОГО бързо. Дори и опитните потребители на една програма не разбират всички елементи от менюто и - пр. офис приложение. Причината опитните Линукс/Юникс потребители да обичат командния ред е свободата, която той предоставя. Възможността да избягат от тези объркващи и хаотични менюта.
Командият ред предоставя и още едно предимство. Потребителят не е ограничен от интерфейса на софтуера. Т.е. на командния ред можете да направите всички тези действия, за които разработчиците на графичния потребителски интерфейс не са се сетили. Това се постига чрез комбинации от команди, които обработват входните дани до достигане на желания резултат.
Стартиране на команден интерпретатор
Команден интерпретатор (shell) се нарича програма, която очаква команди от потребителя, стартира и изпълнява програмите асоциирани с тези команди.
Команден ред обикновено се отнася до реда с който се стартира определена програма или се стартира определено действие. Това е командата(програмата) заедно с необходимите параметри и данни.
Команда може да се нарече всяко име на програма извършваща определено действие. Най-често използваните команди са реализирани в самия команден интерпретатор, за да се изпълняват максимално бързо. Всички останали са самостоятелни програми, които се изпълняват от командния интерпретатор, след като потребителят въведе името на програмата.
Терминал или конзола е свързано с начина на използване на компютрите в миналото - потребителите са се свързвали през работни терминали към един общ компютър. В днешните ОС с този термин можем да наречем програма, която предоставя на потребителя достъп до команден ред и интерпретатор. Такива програми са gnome-terminal или konsole.
Има няколко различни начина да стартирате командния интерпретатор. Ако работите с графична среда за работа като GNOME или KDE можете да стартирате gnome-terminal или konsole. В някои случай графичната среда ще стартира командния интерпретатор автоматично (пр. WMX).
Ако графична среда за работа не е инсталирана или тя не се стартира по подразбиране най-вероятно компютърът ви ще показва черен екран с бели букви подканващи да въведете потребителско име и парола. След въвеждането им ще се стартира интерпретатора на команди.
След стартирането си интерпретатора ще предостави подканващ текст и ще очаква въвеждането на някакви команди. Подканващия текст може да бъде променян от потребителя или администратора на системата като в него може да се съдържа:
- име на потребителя
- име на компютъра
- дата
- текуща работна директория
- друго
По подразбиране подканващия текст завършва с знак долар ($) или знак диез (#). Първият означава, че командата ще бъде изпълнена като обикновен потребител, а втория като root. Това значение е използвано и в тези лекции както и в повечето публикации свързани с Линукс.
Стандартен вход/изход, пренасочване, комбиниране на команди
В Линукс/Юникс е заложена концепцията, че една програма трябва да може да прави само едно нещо и да го прави добре. Ако е нужно да се извърши друго действие за него се създава нова програма. За по-сложни действия се използват комбинации от няколко програми. Това е довело до създаването на много програми, които вършат разнообразни действия. Освен това повечето от тях могат да бъдат изпълнявани в автоматичен режим, чрез задаването на параметри към тях.
Вход/изход/грешка
В Линукс (както и почти всички ОС) всяка програма автоматично е свързана с три стандартни файла. Това са файловете за вход (stdin), изход (stdout) и грешка (stderr). Те се обозначават с числата 0, 1, 2. Тези файлове могат да бъдат пренасочвани, което е полезно при свързването на няколко команди.
Стандартният файл за вход се използва за прочитане на данни от потребителя. Когато програмата се изпълнява в интерактивен режим, данните се въвеждат от потребителя работещ на командния ред. При автоматичен режим данните могат да бъдат прочетени от файл върху твърдия диск или от стандартния вход в зависимост от опциите на програмата.
Стандартния изход се използва за извеждане на данни и резултати от програмата. Той може да бъде пренасочван към файл върху диска или към друга програма.
Файлът за грешка е подобен на файлът за изход. На него се отпечатват съобщения за грешки от програмата. При работа в терминала няма как да различите дали съобщенията за грешка идват от стандартния изход или от изхода за грешка.
Пренасочване на вход/изход/грешка
За да можем да свързваме няколко програми една с друга е необходимо първо да се научим как да пренасочваме входа, изхода или грешките от програмите.
За пренасочване се използват специалните знаци << (двойно по-малко), < (по-малко), > (по-голямо), >> (двойно по-голямо), след името на програмата и всичките и параметри. Те могат да бъдат тълкувани като стрелки, показваши посоката на данните.
- > - пренасочва изхода към файл като изтрива предишното съдържание на файла
- >> - пренасочва изхода към файл като добавя текущото съдържание към предишното съдържание на файла
- << - специално пренасочване наречено документ на място
- < - пренасочва входа
Следват примери:
Командата echo отпечатва текста зададен като параметър
$ echo "Hello"
Hello
$
Чрез знака > (по-голямо) пренасочваме изхода на командата echo към файла greetings.txt и след това го отпечатваме с командата cat
$ echo "Hello" > greetings.txt
$ cat greetings.txt
Hello
$
Нека изпълним този промер няколко пъти с различен текст. Накрая виждаме, че само последния ред е записан във файла, т.к. използвахме пренасочване, което изтрива предишното съдържание на файла.
$ echo "Hello Alexander" > greetings.txt
$ echo "Hello Ivan" > greetings.txt
$ echo "Hello Geogri" > greetings.txt
$ cat greetings.txt
Hello Geogri
Нека опитаме отново като изтрием файла, за да започнем на чисто и използваме пренасочване, което добавя съдържанието в края на файла.
$ rm greetings.txt
$ echo "Hello Alexander" >> greetings.txt
$ echo "Hello Ivan" >> greetings.txt
$ echo "Hello Georgi" >> greetings.txt
$ cat greetings.txt
Hello Alexander
Hello Ivan
Hello Georgi
Ще използваме горния файл, за да търсим в него редове, в които се среща името Alexander. Търсенето става с командата grep. Използваме пренасочване на входа, за да интруктираме grep къде да търси.
$ grep Alexander < greetings.txt
Hello Alexander
$
Специално пренасочване, наречено документ на място (here document) ни позволява да въведем текста, в който искаме да се извърши търсенето, директно след командата. Ограничителят на текста не спада към съсдържанието на самия текст.
$ grep Alexander << _END_
> Hello Ivan
> Hello Alexander
> Hello Georgi
> _END_
Hello Alexander
$
Комбиниране на команди
Комбинирането на команди е действие при което се свързват две или повече команди като входните данни за всяка следваща команда в списъка са изходните резултати от предишната команда. Това дава необходимата гъвкавост при работа с командния интерпретатор.
При традиционната работа с елементи от меню трябва да извършите дадено действие, да запазите резултата във временен файл, да заредите временния файл в програмата, да извършите следващото действие и т.н. Трябва да повтаряте тази последователност толкова пъти, колкото различни действия е нужно да бъдат извършени. Освен това щя трябва да използвате няколко различни програми, за да можете да извършите всички действия. Използването на комбинация от команди може да ви спести доста време и усилие.
За комбинирането на команди в Линукс се използва знака | (отвесна наклонена черта, на англ. pipe). Можете да мислите за този знак като за тръба, която свързва двете програми. Изходните данни от първата програма минават по тръбата и достигат до следващата програма, където играят ролята на входни данни.
Ще обясним това с подробен пример. Нека имаме файла install.log, който съдържа информация за инсталиран софтуер и съобщения за успех/грешка при инсталация. Файлът изглежда по подобен начин.
Installing libgcc-4.1.2-44.el5.ia64
warning: libgcc-4.1.2-44.el5: Header V3 DSA signature: NOKEY, key ID 897da07a
Installing setup-2.5.58-4.el5.noarch
warning: setup-2.5.58-4.el5: Header V3 DSA signature: NOKEY, key ID 37017186
Installing filesystem-2.4.0-2.ia64
Installing basesystem-8.0-5.1.1.noarch
Installing perl-XML-LibXML-1.58-5.ia64
could not find ParserDetails.ini in /usr/lib/perl5/vendor_perl/5.8.8/XML/SAX
Installing cracklib-dicts-2.8.9-3.3.ia64
Installing 2:tog-pegasus-2.7.1-2.el5.ia64
Warning: Use of cimmofl can corrupt the CIM Server Repository.
cimmofl should only be used under very controlled situations.
cimmof is the recommended OpenPegasus MOF compiler.
Installing sblim-cmpi-base-1.5.5-31.el5_2.1.ia64
Съобщенията във файла може да са преведени на друг език освен английски. Искаме да определим коя е най, често срещаната дума във файла, която се появява в първата колона. За тази цел съществува програмата wf, но тя не е налична за нашата дистрибуция. Трябва да измислим комбинация от по-прости програми, които да свършат същата работа:
$ cat install.log | cut -f 1 -d ' ' | sort | uniq -c | tr -s ' ' | sort -nr | head -n1 | cut -f3 -d ' '
Installing
$
Примера се състои от осем различни команди:
-
cat install.log - отпечатва съдържанието на файла - по този начин можем да пренасочим съдържанието към следващата команда в списъка
-
cut -f 1 -d ' ' - отрязва първата колона от текста като използва за разделител празен интервал. Данните на този етап изглеждат така:
$ cat install.log | cut -f 1 -d ' '
Installing
warning:
Installing
warning:
Installing
Installing
Installing
could
Installing
Installing
Warning:
Installing
$
-
sort - сортира редовете с текст. Изхода изглежда така:
$ cat install.log | cut -f 1 -d ' ' | sort
could
Installing
Installing
Installing
Installing
Installing
Installing
Installing
Installing
warning:
warning:
Warning:
$
-
uniq -c - преброява уникалните редове:
$ cat install.log | cut -f 1 -d ' ' | sort | uniq -c
3
1 could
8 Installing
2 warning:
1 Warning:
$
-
tr -s ' ' - замества (translate) всички поредици от празни интервали с един празен интервал
$ cat install.log | cut -f 1 -d ' ' | sort | uniq -c | tr -s ' '
3
1 could
8 Installing
2 warning:
1 Warning:
$
-
sort -nr - сортира текста отново. Използва числово сортиране в обратен ред
$ cat install.log | cut -f 1 -d ' ' | sort | uniq -c | tr -s ' ' | sort -nr
8 Installing
3
2 warning:
1 Warning:
1 could
$
-
head -n1 - отрязва само първия ред от върха на файла. Това ще ни даде реда на думата с най-много срещания, т.к. данните вече са сортирани:
$ cat test.log | cut -f 1 -d ' ' | sort | uniq -c | tr -s ' ' | sort -nr | head -n1
8 Installing
$
-
cut -f3 -d ' ' - отрязва третата колона текст след разделител празен интервал, т.е. след 2я разделител. Това е думата която търсим
$ cat install.log | cut -f 1 -d ' ' | sort | uniq -c | tr -s ' ' | sort -nr | head -n1 | cut -f3 -d ' '
Installing
$
При работа с дълги комбинации от команди може да ги разбием на по-къси като използваме временни файлове. Всичко зависи от начина ни на работа.
Списък с полезни команди в Линукс
Следващия списък не е изчерпателен. Съществуват много програми, които могат да се използват като команди от командния интерпретатор. По-долу са дадени едни от най-често използваните.
Работа с файлове
-
ls - показва списък с файловете в директорията
$ ls
greetings.txt install.log
-
ls -al - показва форматиран списък, заедно със скритите файлове и директории
$ ls -al
total 16
drwxrwxr-x 2 student student 4096 2008-12-18 17:05 .
drwx------ 44 student student 4096 2008-12-18 17:04 ..
-rw-rw-r-- 1 student student 40 2008-12-18 17:05 greetings.txt
-rw-rw-r-- 1 student student 746 2008-12-18 17:04 install.log
-
cd <директория> - влиза в директория
$ pwd
/home/student
$ cd temp/
$ pwd
/home/student/temp/
-
cd - влиза в домашната (личната) директория
$ cd
$ pwd
/home/student
-
pwd - показва текущата директория
$ pwd
/home/student
-
mkdir <директория> - създава директория
$ mkdir d1 d2
$ ls -l
total 16
drwxrwxr-x 2 student student 4096 2008-12-18 17:06 d1
drwxrwxr-x 2 student student 4096 2008-12-18 17:06 d2
-rw-rw-r-- 1 student student 40 2008-12-18 17:05 greetings.txt
-rw-rw-r-- 1 student student 746 2008-12-18 17:04 install.log
$ rm greetings.txt
$ ls
d1 d2 install.log
-
rm -r <директория> - изтрива директория и всички файлове в нея
$ rm -r d1/
$ ls
d2 install.log
-
rm -f файл - изтрива файл без въпроси (force) - използвай внимателно
-
rm -rf дир - изтрива директория и всички файлове в нея без въпроси (force) - използвай внимателно
-
cp <файл1> <файл2> - копира файл1 във файл2
$ cp install.log install_copy.log
$ ls -l
total 12
drwxrwxr-x 2 student student 4096 2008-12-18 17:06 d2
-rw-rw-r-- 1 student student 746 2008-12-18 17:09 install_copy.log
-rw-rw-r-- 1 student student 746 2008-12-18 17:04 install.log
-
cp -r <дир1> <дир2> - копира дир1 в дир2; създава дир2 ако тя не съществува
$ cp -r /tmp/ .
$ ls -l
total 16
drwxrwxr-x 2 student student 4096 2008-12-18 17:12 d2
drwxrwxr-t 180 student student 12288 2008-12-18 17:12 tmp
-rw-rw-r-- 1 student student 746 2008-12-18 17:09 install_copy.log
-rw-rw-r-- 1 student student 746 2008-12-18 17:04 install.log
-
mv <файл1> <файл2> - преименува или премества файл1 във файл2. Ако файл2 е съществуаща директория, премества файл1 в нея
$ mv install.log install_copy.log d2/
$ ls
d2
$ ls d2/
install_copy.log install.log
-
ln -s <файл_към_който_ще_сочи_връзката> <име_на_връзката> - създава символична връзка към файл
$ ln -s d2/ slink
$ ls -l
total 4
drwxrwxr-x 2 student student 4096 2008-12-18 17:12 d2
lrwxrwxrwx 1 student student 3 2008-12-18 17:14 slink -> d2/
-
touch <файл> - създава празен файл
$ touch newfile
$ ls -l
total 4
drwxrwxr-x 2 student student 4096 2008-12-18 17:12 d2
-rw-rw-r-- 1 student student 0 2008-12-18 17:15 newfile
lrwxrwxrwx 1 student student 3 2008-12-18 17:14 slink -> d2/
-
cat <файл> - отпечатва съдържанието на файла
-
less <файл> - показва съдържанието на файл. Можем да търсим текст или да прелистваме съдържанието напред/назад.
-
head <файл> - показва първите 10 реда от файл
-
tail <файл> - показва последните 10 реда от файл
-
tail -f <файл> - показва съдържанието на файл, докато той нараства, започвайки от последните 10 реда. За да изпробвате добавете съдържание към файла чрез командата echo докато го разглеждате.
Системна информация
-
date - показва текущата дата и час
$ date
Thu Dec 18 17:27:33 EET 2008
-
cal - показва календара за текущия месец
$ cal
December 2008
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
-
uptime - от колко време работи машината
$ uptime
17:28:05 up 27 min, 1 user, load average: 0.00, 0.02, 0.05
-
w или who- показва кои потребители в момента са в системата
$ w
17:29:12 up 28 min, 2 users, load average: 0.03, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
student pts/0 192.168.1.7 17:03 0.00s 0.41s 0.08s w
alexx pts/1 192.168.1.7 17:29 8.00s 0.20s 0.20s -bash
$ who
student pts/0 2008-12-18 17:03 (192.168.1.7)
alexx pts/1 2008-12-18 17:29 (192.168.1.7)
-
whoami - името, с което сте влезли в системата
$ whoami
student
-
uname -a - показва информация за ядрото
$ uname -a
Linux fujiyama 2.6.27.7-134.fc10.i686 #1 SMP Mon Dec 1 22:42:50 EST 2008 i686 i686 i386 GNU/Linux
-
cat /proc/cpuinfo - информация за процесора
-
cat /proc/meminfo - информация за паметта
-
man <команда> - отваря помощната страница за командата. Използвайте -k или -K за търсене по определена дума (виж man man).
-
df - информация за дисковото пространство. Най-често с -h
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_root-lv_root
37G 20G 16G 56% /
/dev/sda1 99M 28M 67M 30% /boot
tmpfs 219M 0 219M 0% /dev/shm
-
du - използваното пространство в текущата директория. Най-често с -hs
$ du -hs
66M .
-
free - информация за използваната памет. -m за Mb.
$ free -m
total used free shared buffers cached
Mem: 437 248 188 0 13 95
-/+ buffers/cache: 140 297
Swap: 511 0 511
-
whereis <програма> - възможните местоположения на програмата и файлове свързани с нея.
$ whereis pidgin
pidgin: /usr/bin/pidgin /usr/lib/pidgin /usr/share/man/man1/pidgin.1.gz
-
which <програма> - коя програма ще се стартира. Връща пълното име на изпълнимия файл.
$ which pidgin
/usr/bin/pidgin
Търсене на текст или файлове
-
grep текст файлове - търси текст във файлове
$ grep warning d2/install.log
d2/install.log:warning: libgcc-4.1.2-44.el5: Header V3 DSA signature: NOKEY, key ID 897da07a
d2/install.log:warning: setup-2.5.58-4.el5: Header V3 DSA signature: NOKEY, key ID 37017186
-
grep -R текст дир - търси рекурсивно в дир
$ grep warning -R .
./slink/install_copy.log:warning: libgcc-4.1.2-44.el5: Header V3 DSA signature: NOKEY, key ID 897da07a
./slink/install_copy.log:warning: setup-2.5.58-4.el5: Header V3 DSA signature: NOKEY, key ID 37017186
./slink/install.log:warning: libgcc-4.1.2-44.el5: Header V3 DSA signature: NOKEY, key ID 897da07a
./slink/install.log:warning: setup-2.5.58-4.el5: Header V3 DSA signature: NOKEY, key ID 37017186
./d2/install_copy.log:warning: libgcc-4.1.2-44.el5: Header V3 DSA signature: NOKEY, key ID 897da07a
./d2/install_copy.log:warning: setup-2.5.58-4.el5: Header V3 DSA signature: NOKEY, key ID 37017186
./d2/install.log:warning: libgcc-4.1.2-44.el5: Header V3 DSA signature: NOKEY, key ID 897da07a
./d2/install.log:warning: setup-2.5.58-4.el5: Header V3 DSA signature: NOKEY, key ID 37017186
-
command | grep текст - търси текст в резултата от изпълнението на команда command
$ cat d2/install.log | grep warn
warning: libgcc-4.1.2-44.el5: Header V3 DSA signature: NOKEY, key ID 897da07a
warning: setup-2.5.58-4.el5: Header V3 DSA signature: NOKEY, key ID 37017186
-
locate файл - намира всички файлове с име файл. Използва база данни с имената на файловете. Базата данни се обновява периодично. Работи бързо, но файлове създадени след последното обновяване на базата данни няма да бъдат намерени.
-
find - търси файлове на твърдия диск. Не използва база данни и работи по-бавно от locate. Има различни опции и параметри за дефиниране на търсенето.
$ find . -name "install.log"
./d2/install.log
Бързи клавиши
- Ctrl+C – прекъсва текущата команда
- Ctrl+Z – стопира/приспива/ текущата команда. За стартиране, използвайте fg и bg
- Ctrl+D – прекъсване на сесията, като exit
- Ctrl+W – изтрива една дума от текущия ред
- Ctrl+U – изтрива целия ред
- Ctrl+R – търсене в последните команди
- !! - повтаря последната команда
- exit – изход от текущата сесия
- Копиране на текст - селектира се с мишката и се поставя на новото място чрез натискане на средния бутон (колелцето или 2та бутона заедно).
Връзки