Bash основе

Извор: ВикиЕТФ

Bash је најкоришћеније командно окружење на Линукс системима. Као и свако командно окружење јуниксоликих система нуди основне могућности као што су: извршавање команди, преусмеравање улаза/излаза, условно извршавање команди,... Командно окружење на Јуникс системима није само интерфејс за извршавање команди, оно такође у себи поседује све примитиве програмског језика. У овом тексту се концентришем на интерактивно коришћење командног окружења.

Напомена: Линије које почињу долар знаком ($) означавају промпт(одзивник) а после њега иду команде које уносите.

Садржај

Опције

Већина јуниксоликих система се придржава стандарда POSIX а ни Линукс није изузетак. То спомињем због тога што се у том стандарду прописује синтакса за задавање опција путем командне линије. Овде ћу Вам рећи како се стандардно задају опције командама, ал можете наићи на програме који га се не придржавају из овог или оног разлога.

Стандардно је да такозване кратке команде почињу са линијом(-) иза које следи слово које означава опцију. Ако опција прима параметар онда он мора да следи после слова одвојен размаком.

Постоје и такозване дуге опције које почињу са две линије(--) иза којих следи њихов пун назив.

Једна од опција "ls" програма је "-s", ако применимо ову опцију над програмом "ls", он ће штампати величину фајла у блоковима. Пошто ово није баш најзгоднији начин да видимо величину фајла користићемо и опцију "-h" да бисмо видели величине у килобајтима, мегабајтима,... Ред којим се задају опције је произвољан("-hs", "-sh"), и могу се раздвајати("-h -s", "-s -h") и на крају ћемо добити исти резултат.

$ ls -s
248 bookmarks.html       92 bookmarks.html3.gz
$ ls -sh
248K bookmarks.html       92K bookmarks.html3.gz

Опције "-s" и "-h" које смо до сада видели су биле пример кратких опција, такође постоје њихове продужене верзије које повећавају читљивост али и време потребно за унос.

$ ls --size --human-readable
248K bookmarks.html       92K bookmarks.html3.gz

Опције сваке команде су документоване у њиховим ман страницама.

Основне команде

Овде ћу навести основне команде на Линукс системима. Неки од ових команди су уграђени у командно окружење, а неке постоје као засебни програми. Пошто се ово разликује за свако командно окружење ја ћу овде наводити како то функционише у Bash-у.

Кретање по фајл систему

Основне команде за кретање по фајл систему су "cd", "pwd", "ls". Команде "cd" и "pwd" су типичан пример уграђених команди, што је и логично да би се избегао трошак на позивање засебних програма.

$ pwd
/home/user

Подразумевани директоријум за сваког корисника је његов родитељски директоријум.

$ cd ..
$ pwd
/home

Видимо да кад задамо команди "cd" да иде у директоријум означен са "..", он иде један директоријум изнад у хијерархији.

$ cd .
$ pwd
/home

Када му задамо само тачку команда "cd" не ради ништа пошто је то ознака за текући директоријум.

$ ls -l
total 0
drwxr-xr-x 2 user user 48 2007-05-26 12:07 dir
-rw-r--r-- 1 user user  0 2007-05-26 12:07 file1
-rw-r--r-- 1 user user  0 2007-05-26 12:07 file2

Овде користимо проширени приказ команде "ls". Формат излаза је следећи:

drwxr-xr-x 2 user user 48 2007-05-26 12:07 dir
^********* ^ **** ^^^^ ** ^^^^^^^^^^^^^^^^ ***
1   2      3  4     5   6       7           8
  1. Ово слово означава тип фајла. Најчешће ћемо наилазити на четири ознаке: "d" за директоријум, "c" карактерни уређај(char dev), "b" за блоковски уређај(block dev), "-" за обичан фајл, "s" за Јуникс утичницу, "p" за именовану цев, "l" за симболичку пречицу.
  2. Постоје три типа дозвола: "r" читање, "w" писање, "x" извршавање, а "-" означава укинуту дозволу. Дозволе иду редом, по три дозволе за власника(owner), власничку групу(owner group) и све остале(others).
  3. Број чврстих веза ка том фајлу
  4. Власник фајла
  5. Власничка група
  6. Величина фајла
  7. Време последње промене фајла
  8. Име фајла
$ ls -a
.
..
.SkriveniFajl1
.SkriveniFajl2

На Unix-оликим системима скривени фајлови почињу са тачком, да бисмо их приказали са програмом "ls" користимо опцију "".

$ ls -ld /boot
drwxr-xr-x 3 root root 648 2008-03-01 07:57 /boot

Пошто програм "ls" листа садржај сваког задатог директоријума постоји и опција кад хоћемо да урадимо листинг самог директоријума. То радимо са опцијом "-d", као у овом примеру.

Опција Опис
-d Листа директоријуме уместо њиховог садржаја
-l Даје проширени листинг
-a Приказује скривене фајлове, на Јуниксу они почињу са тачком
-i Приказује инодове поред фајлова
-R Листа директоријуме рекурзивно
-s Са "-l" опцијом штампа величину свих фајлова у блоковима
-h Са "-l" опцијом штампа величину фајлова у читљивом формату (нпр. 1K, 234M)
-p Додаје "/" индикатор на крају директоријума
ctime} Заједно са "-l" штампа и последње време приступа или промене инода

Руковање фајл системом

Руковање фајл системом подразумева копирање, померање и брисање фајлова. На Линуксу то радимо са три команде "cp", "mv", "rm".

$ cp stariFajl noviFajl

Копирамо фајл "stariFajl" у "noviFajl".

$ cp -r stariDir noviDir

Копирамо директоријум "stariDir" и сав његов садржај("-r" recursive) у нови директоријум "noviDir/stariDir".

$ cp fajl1 fajl2 fajl3 dir

Копирамо све фајлове ("fajl1", "fajl2", "fajl3") у директоријум "dir".

Опција Опис
-r Копира рекурзивно директоријуме
-p Чува права приступа, власништво и временске ознаке фајла
-u --update Копира изворни фајл само ако је новији од одредишта
$ mv staroIme novoIme
$ rm fajl1 fajl2 fajl3
$ rm -r dir
Опција Опис
-r Брише рекурзивно директоријуме
-f Игнорише непостојеће фајлове и никад ништа не пита

Рад са дозволама

Сваки фајл у Линуксу поседује сопствена овлашћења за власника, власничку групу и све остале. Та овлашћења припадају категоријима читања, писања и извршавања фајла.

Ако желимо да видимо овлашћења за неки фајл користимо "ls -l" команду. А овако су распоређене словне ознаке овлашћења. Ако уместо неке словне ознаке дозволе имамо цртицу ('-'), онда је та дозвола поништена.

    rwx            rwx           rwx
 [власник]  [власничка група]  [остали]

Још треба напоменути, за обичан фајл у Линуксу је јасно шта значе ова овлашћења, али за фајл који представља директоријум она имају другачију сврху. Право за читање нам дозвољава да листамо директоријум, за извршавање да улазимо у њега, а писање да правимо и бришемо фајлове у њему. Ако знамо да је директоријум само обичан фајл са табелом имена фајлова и припадајућих инодова(inode) који показују ка садржају, биће нам јасан овај приступ.

$ ls -l fajl
-rw-r--r-- 1 user user 0 2007-06-12 09:39 fajl

За сада смо научили да читамо дозволе и шта те дозволе значе. Ако желимо да их мењамо онда користимо "chmod"(енг. CHange MODode) команду. Општи шаблон за команду је следећи:

chmod [opcija]... {MOD | --reference=referentni_fajl} fajl1...

Дозволе можемо давати у окталном и симболичком облику. Октални облик задавање дозвола је погодан када морамо да изменимо комплетну дозволу тако што директно задајемо вредност свих битова дозвола. Када их дајемо симболичком можемо да додајемо или одузимамо појединачне дозволе од фајла а да притом не утичемо на остале битове дозвола.

Код симболичког облика задавања дозвола прво одређујемо категорију корисника.

u Корисник
g Власничка група
o Сви остали
a Означава све категорије корисника, што је уједно и подразумевана категорија корисника.

Онда задајемо дозволе на сл. начин:

$ chmod u+r fajl

Овде дајемо власнику фајла право да чита дати фајл.

$ chmod gu-w fajl

Можемо да комбинујемо категорије и да примењујемо истовремено операције на њиховим дозволама. Извршавањем ове команде смо одузели права уписа у фајл власничкој групи и власнику.

$ chmod u+r,o-w fajl

Када имамо више различитих операција да применимо можемо да их ставимо у листу одвојену за зарезима. Овде смо власнику дозволили да уписује у фајл а осталима(онима који се не налазе у власничкој групи и нису власници) смо одузели право уписа у фајл.

$ chmod u=rwx,go= fajl

Овде фиксно одређујемо дозволе за фајл, власник има сва права а власничка група и остали немају никаква права.


Када задајемо дозволе уз помоћ окталних бројеве ми уствари мењамо по три бита дозволе за сваку категорију корисника, ти битови имају следеће значење:

4 читање (енг. read)
2 упис (енг. write)
1 извршавање (енг. exec)
$ chmod 641 fajl

Овде смо у једној команди дали право читања и писања власнику, власничкој групи смо дозволили само читање а свима осталима извршавање.

Када имамо потребу да рекурзивно променимо дозволе у директоријуму и свим фајловима испод њега користимо опцију "-R". Треба бити пажљив при задавању опција у окталном облику јер лако можемо дати погрешна права директоријумима или обичним фајловима, зато је боље користити симболички облик задавања дозвола као у следећем примеру.

$ chmod -R go-rwx dir

Овом командом смо одузели сва права власничкој групи и осталима у директоријуму "dir" и свим фајловима испод њега у хијерархији.

Опција Опис
-R Рекурзивно мења права приступа у директоријумима

umask

Ако вам је потребно да одузимате права над новим фајловима користите уграђену команду "umask". Њој дајете као параметар дозволе које желите да укинете у окталном облику.

$ umask
0022
$ touch fajl
$ ls -l fajl
-rw-r--r-- 1 user user 0 2009-03-25 18:53 fajl
$ rm fajl
$ umask 077
$ touch fajl
$ ls -l fajl
-rw------- 1 user user 0 2009-03-25 18:54 fajl

Првобитно смо одузимали права за упис власничкој групи и осталима над фајлом, а касније смо одузели сва права над тим групама дозвола.

Специјалне дозволе

Осим класичних дозвола постоје три специјалне дозволе које нам дају већу флексибилност.

$ ls -l /usr/bin/sudo
-rwsr-xr-x 2 root root 115136 2009-02-17 04:17 /usr/bin/sudo

Овде видимо да при проширеном приказу команде "ls" у групи дозвола за власника уместо извршног бита имамо слово "s", ово слово је велико ако корисник нема права да извршава фајл.

$ cp /bin/sh ~/
$ chmod 777 sh
$ chmod u+s ~/sh
$ ls -l ~/sh
-rwsrwxrwx 1 user user 87924 2009-03-25 21:18 sh

Овде видимо синтаксу за сетовање "SUID" бита на фајлу. Овде смо прекопирали командно окружење "sh" и омогућили свим корисницима да га изврше као корисник "user".

$ mkdir pos
$ chmod g+s pos
$ chgrp adm pos
$ ls -ld pos
drwxrws--- 2 user adm 4096 2009-03-25 21:36 pos
$ touch pos/fajl
$ mkdir pos/dir
$ ls -ld pos/fajl pos/dir
drwxrws--- 2 user adm 4096 2009-03-25 21:37 pos/dir
-rw-rw---- 1 user adm    0 2009-03-25 21:37 pos/fajl

Опет смо користили сличну синтаксу за симболичка права приступа као и у "SUID" случају. Такође смо видели да важи све оно што смо рекли у претходном пасусу, а то је да фајлови и директоријуми наслеђују власничку групу родитељског директоријума стим да директоријум такође има намеште "SGID" бит, па тако се ова особина пропагира даље.

$ ls -ld /tmp
drwxrwxrwt 34 root root 2184 2009-03-25 21:15 tmp
$ ls -l /tmp/fajl_od_drugog_korisnika
-rw------- 1 other_user other_user 7374 2009-03-05 16:05 /tmp/fajl_od_drugog_korisnika
$ rm /tmp/fajl_od_drugog_korisnika
rm: cannot remove `/tmp/fajl_od_drugog_korisnika': Operation not permitted

Мењање власништва фајлова

Поред тога што можемо да мењамо дозволе за све три групе корисника понекад је потребно да се мења власник или власничка група фајла. То радимо са командама "chown" и "chgrp" за које погађамо чему служе из назива. У виду треба имати да само "root" има право да мења власника фајла, док корисник може да мења власничку групу свог фајла ако припада одредишној групи.

$ ls -l fajl
-rw-r--r-- 1 user user 0 2009-03-25 17:28 fajl
$ sudo chown other_user fajl
$ ls -l fajl
-rw-r--r-- 1 other_user user 0 2009-03-25 17:28 fajl

Овде смо видели да при предаји власништва над фајлом морамо да извршимо програм "chown" уз помоћ "sudo" команде да би имали администраторска овлашћења.

$ ls -l fajl
-rw-r--r-- 1 user user 0 2009-03-25 17:28 fajl
$ groups
user adm dialout cdrom video plugdev lpadmin admin sambashare
$ chgrp adm fajl
$ ls -l fajl
-rw-r--r-- 1 user adm 0 2009-03-25 17:28 fajl

Овде смо и мењали власничку групу. Прво смо видели којим групама припада корисник "user" да би видели са којим групама располажемо.

$ chown -R user:group dir

Када требамо да мењамо власништво рекурзивно унутар директоријума користимо опцију "-R". Такође можемо да користимо команду "chown" и за мењање власничке групе, само је потребно да је одвојимо са двотачком од корисничког имена власника, као што смо урадили у претходном примеру.

Рад са архивама

На Линуксу су честе "gzip" и "bzip2" архиве. Постоје и програми за њихово паковање("gzip" и "bzip2") и распакивање("gunzip" и "bunzip2"). Оно што се разликује од ".zip" архива је то што оне раде само са појединачним фајловима. Тако да кад нам је потребно да запакујемо више фајлова у један користимо "tar" програм. Као што видимо и овде је присутна она Јуникс филозофија: "Сваки програм треба да ради једну ствар и да је ради добро".

gzip

gzip [ -acdfhlLnNrtvV19 ] [-S suffix] [ name ...  ]
gunzip [ -acfhlLnNrtvV ] [-S suffix] [ name ...  ]
$ ls -l
total 32
-rw------- 1 user user 30720 2009-03-25 23:22 fajl
$ gzip fajl
$ ls -l
total 8
-rw------- 1 user user 6138 2009-03-25 23:22 fajl.gz

Овде видимо како команда "gzip" брише оригинале за собом и чува права приступа.

$ gunzip fajl.gz
$ ls -l
total 32
-rw------- 1 user user 30720 2009-03-25 23:22 fajl

Декомпресује фајл "fajl.gz" у фајл "fajl" и брише полазни фајл.

Опција Опис
-l Штампа податке о компресованом фајлу
-r Ако је задат параметар, директоријум, "gzip" ће рекурзивно паковати све фајлове у њему, док у случају "gunzip" ће се радити распакивање
-S .suf Суфикс који се ставља на крају, уместо ".gz"
-t Проверава интегритет компресованог фајла
-123456789 Одређује степен компресије. "-1" је најбржи, док је "-9" најбољи.

bzip2

bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ...  ]
bunzip2 [ -fkvsVL ] [ filenames ...  ]

Ове команде функционишу исто као и "gzip" и "gunzip" парњаци. Опције: "-l", "-t", "-123456789" су присутне и овде и имају иста значења.

tar

Команда "tar" служи само за смештање више фајлова у један(tape archive), али има и опцију за компресију и декомпресију са горе поменутим програмима.

Као прву опцију увек наводимо главну операцију коју обављамо, а после наводимо додатне опције. Ако желимо да направимо архиву задаћемо као прву опцију "-c" ("create"), опцијом "-f" ћемо да му кажемо име одредишног фајла. Уобичајено је да се име "tar" архиве завршава са ".tar". А после тога само наводимо фајлове и директоријуме које желимо да ставимо у архиву.

$ tar -c -f fajl.tar fajl1 fajl2 dir

За распакивање архиве ћемо користити главну опцију "-x" на сличан начин као и опцију "-c". Следећа команда распакује садржај архиве у текући директоријум.

$ tar -x -f fajl.tar

Ако желимо да направимо компресовану архиву, или да је распакујемо користићемо опцију "-j" за "bzip2" архиву, и опцију "-z" за "gzip". Пошто ми уствари прво правимо ".tar" фајл и касније га компресујемо, уобичајено је да додамо екстензије ".gz" или ".bz2" у зависности од коришћене компресије на крај имена архиве.

$ tar -c -z -f fajl.tar.gz fajl1 fajl2 dir
$ tar -czf fajl.tar.gz fajl1 fajl2 dir
$ tar -xzf fajl.tar.gz
$ tar -xjf fajl.tar.bz

Још пар опција може бити од посебне користи:

Рад са текстуалним фајловима

Линукс углавном своје фајлове за подешавање држи као обичне текстуалне фајлове које можемо да уређујемо обичним текст едитором. Добар пример за то су конфигурациони фајлови у "/etc" директоријуму.

Постоје два едитора који се најчешће користе за те сврхе а то су "vim" и "emacs". Нису једноставни за учење и имају много опција али кад их једанпут научите постаћете много продуктивнији.

За почетак ће вам добро послужити "gedit" из "Gnome" графичког окружења, или "nano" у командном окружењу.

nano

Nano.png

Рад у "nano" едитору је једноставан и када га стартујете проследите му име фајла који желите да мењате. Видећете да на дну имате излистане најћешће команде, те команде имају испред сваког слова "^" знак, што значи да треба да држите тастер "Ctrl" и тај знак.

$ nano fajl.txt

cat

Такође кад треба да прегледате неке кратке фајлове можете да користите програм "cat". Он штампа на стандардни излаз фајлове које сте му дали, такође може да служи за спајање више фајлова у један.

$ cat fajl.txt
RMS je skracenica od Richard Matthew Stallman
On je osnovao GNU fondaciju
Napisao je Emacs, GCC, GDB,...

Ово је најпростији пример коришћења кад само штампамо садржај једног фајла.

$ cat - > novi.fajl
Neki sadrzaj
$ cat novi.fajl
Neki sadrzaj

Када желимо брзо да направимо нови фајл са неким текстом можемо да користимо горе наведени трик. Када унесемо прву команду и притиснемо Ентер ми уствари кажемо "cat" програму да чита са стандардног улаза тако што наведемо цртицу ("-") и да оно што прими пошаље на стандардни излаз који смо преусмерили у "novi.fajl" (Преусмеравање улаза/излаза). По завршетку уноса треба унети знак за крај фајла, на Линуксу је он "Ctrl+D", што је еквивалент "Dos"-овом "Ctrl+Z".

less и more

Ова два програма могу да вам помогну да бисте читали текстуелне фајлове уз могућност навигације. Програм "more" је ограничен у односу на "less" пошто не може да се враћа уназад. Иначе и "less" и "more" прихватају курсоарске тастере за навигацију и за излаз користите "q" тастер.

$ ls / | less

Ово је један од примера прослеђивања излаза команде у стандардни улаз програма "less".

Системске команде

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hdb3              21G  2.3G   17G  12% /
$ du ./
0      ./.mc/cedit
60     ./.mc
16     ./.qt
4      ./RCS
4      ./TMP/Glade-Perl-Two-0.01/bin
...

Овде смо добили листинг величина свих директоријума испод текућег, што иначе и ради ако му не дамо експлицитно директоријум.

$ du -sh /home/user/
709M        /home/user/Desktop

Сада смо користили опцију "-s" да би смо добили суму само за дате аргументе, а "-h" смо користили на исти начин као и у команди "df".

$ du -h --max-depth=1 /home/user/

36K  /home/user/.smplayer                                           
4.0K /home/user/.update-notifier                                    
46M  /home/user/.cpan                                               
1.1M /home/user/.gconf                                              
768K /home/user/.tomboy                                             
21G  /home/user/Videos                                              
30M  /home/user/.local                                              
7.0M /home/user/.themes                                             
174M /home/user/.mozilla                                            
64K  /home/user/.dbus                                               
4.0K /home/user/.gpilotd
....'

Када нам је потребно да видимо величину свих фајлова у текућем фолдеру или оним фолдерима које смо навели као аргументе можемо користити опцију "--max-depth" као у претходном примеру.


$ free
             total       used       free     shared    buffers     cached
Mem:       1036644     993340      43304          0      52332     703704
-/+ buffers/cache:     237304     799340
Swap:       947792          0     947792

Ако желите да промените период освежавања кликните на тастер "d" и унесите жељени период у секундама.

Типичан екран "top" програма:

top - 12:07:07 up 55 min,  6 users,  load average: 0.10, 0.05, 0.02
Tasks: 135 total,   2 running, 133 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.6%us,  0.3%sy,  0.0%ni, 96.0%id,  1.3%wa,  0.4%hi,  0.3%si,  0.0%st
Mem:   1029076k total,   907884k used,   121192k free,    44876k buffers
Swap: 10241428k total,        0k used, 10241428k free,   470136k cached

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                 
6391 user      15   0  290m  41m  20m S    6  4.1   1:05.54 ktorrent           
5975 root      15   0  105m  37m  10m R    4  3.8   0:11.63 Xorg             
6411 user      15   0  125m 7668 5072 S    2  0.7   0:00.02 kio_file       
6679 user      15   0 19080 1232  876 R    2  0.1   0:00.01 top      
   1 root      18   0  3960  888  624 S    0  0.1   0:00.95 init                                    
   2 root      10  -5     0    0    0 S    0  0.0   0:00.00 kthreadd
$ top -n 1 > top.out

Овде смо рекли програму "top" да пошаље само једну итерацију стања на систему и проследили смо излаз у фајл. Ово је корисно ако Вам је систем преоптерећен а не знате шта је проблем па можете да пошаљете некоме ко зна.

$ uname -a
Linux debian 2.6.18-4-k7 #1 SMP Mon Mar 26 17:57:15 UTC 2007 i686 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 4.0 (etch)
Release:        4.0
Codename:       etch

Тражење фајлова

Да бисте тражили фајлове на Линуксу можете да користите наредбу "find". Наредба "find" се даје у облику "find putanja/od/koje/trazimo [izraz po kome vrsimo pretrazivanje]". Морате обратити пажњу да за сваки фајл(директоријуми су исто фајлови, као и све остало у Јуниксу) у путањи коју смо навели извршавамо израз. Израз може да се састоји од серије опција, тестова и акција које могу имати тачну или нетачну вредност и међусобом су подељени са операторима као што су нпр. "-and" или "-or". Ако не наведемо ниједан оператор подразумева се оператор "-and".

Опције увек враћају тачну вредност и мењају понашање израза надаље, нпр. -maxdepth 3 каже команди find да залази најдубље 3 директоријума у дубину. Тестови враћају вредност у складу са резултатом теста који су обавили. Акције и поред тога што враћају вредност такође имају споредне ефекте, нпр. -print штампа име фајла и увек враћа тачну вредност.

$ find /usr/ -name "*.h" -and -print
/usr/lib/gcc/x86_64-linux-gnu/4.1/include/mm3dnow.h
/usr/lib/gcc/x86_64-linux-gnu/4.1/include/mmintrin.h
/usr/lib/gcc/x86_64-linux-gnu/4.1/include/linux/a.out.h
/usr/lib/gcc/x86_64-linux-gnu/4.1/include/varargs.h
/usr/lib/gcc/x86_64-linux-gnu/4.1/include/unwind.h

$ find /usr/ -name "*.h"
/usr/lib/gcc/x86_64-linux-gnu/4.1/include/mm3dnow.h
/usr/lib/gcc/x86_64-linux-gnu/4.1/include/mmintrin.h
/usr/lib/gcc/x86_64-linux-gnu/4.1/include/linux/a.out.h
/usr/lib/gcc/x86_64-linux-gnu/4.1/include/varargs.h
/usr/lib/gcc/x86_64-linux-gnu/4.1/include/unwind.h

$ find ~/ -name "*~" -exec rm "{}" \;

Ове две команде дају исте резултате зато што "find" штампа имена фајлова који пролазе тест(-name "*.h") ако се не наведе ниједна друга акција. Ако наведемо неку другу акцију онда ћемо морати експлицитно да наведемо "-print".

Последња команда нам показује како згодно можемо да користимо програм "find" да проналазимо и елиминишемо те досадне привремене фајлове. Морам наравно да напоменем да користите "rm" програм са великим опрезом. Акција "-exec" прима стринг који треба да се изврши и замењује затворене витичасте заграде("{}") са именом фајла који испуњава тестове. На крају сваке команде обавезно ставите тачку запету(";").

Када задајемо нумеричке параметре "find" тестовима постоје три начина за њихово задавање. Са знаком плус означавамо веће вредности, а минусом означавамо мање, ако не ставимо знак тражимо тачно поклапање са задатим бројем.

Опција Опис
Корисни find тестови
-name "sablon" Тражи фајл који одговара датом шаблону, можемо да користимо џокере, * мења више или ниједан знак, док ? мења један или ниједан. У случају да користимо џокере обавезно је стављање шаблона под наводнике иначе ће командо окружење извршити замену(глобирање)
-iname "sablon" Ради све што и претходна опција само не води рачуна о величини слова(case Insensetive).
-ctime n Прима нумерички параметар(види горе), и тражи фајлове којима је статус(дозволе, власник, власничка група,...) измењен пре "n" дана, после или тачно. Имате и његовог брата -cmin ако рачунате у минутима.
-mtime n Понаша се као и опција "-ctime" само што тражи по времену промене фајла, такође у данима, и има свог парњака "-mmin" који тражи у минутима.
-atime n Ако желимо да тражимо по времену последњег приступа фајлу користићемо ову опцију(-amin).
-type c Ако желимо да тестирамо по типу, неки од типова су "d" директоријум, "f" обичан фајл, "s" socket,...
-xdev Не улази у директоријуме који се налазе на другим фајл системима.
$ find dir/ \( -type d -exec chmod 700 '{}' ';' \) -or \( -type f -exec chmod 600 \{\} \; \)

Овде користимо све о чему смо причали и мало више од тога. Заграде користимо са истим смислом као и у сваком програмском језику да би регулисали редослед извршавања. Велике и витичасте заграде су стављене под наводнике (наводници) због специјалног значења са командно окружење као и ";". Ова команда рекурзивно проверава све фајлове испод директоријума "dir" и у зависности од тога да ли је у питању обичан фајл или директоријум даје му одговарајуће дозволе.

Условно комбиновање команди

У Јуниксу све команде враћају неку вредност, ако је не задамо експлицитно у програму онда је то нула. Нула је еквивалент тачне вредности, а било која друга вредност је нетачна. Знајући то можемо да користимо операторе "&&" и "||" за условно извршавање команди. Оператор "&&" извршава следећу команду само ако је претходна команда вратила нулу(то значи да се успешно извршила), а у случају оператора "||" команда се извршава само ако је претходна команда вратила вредност различиту од нуле.

$ komanda1 && komanda2
$ komanda1 || komanda2

Да би сте видели вредност ових конструкција користићемо уграђену команду "test". За разлику од осталих команди које сам навео, ова је уграђена у само извршно командно окружење. Можемо да видимо да ли постоји неки фајл и да извршимо команду у зависности од тога, "test -а FAJL" тестира постојање фајла (небитна је његова врста).

$ test -a ~/.bashrc && source .bashrc

Проверава да ли постоји фајл ".bashrc" и извршава команде тог фајла у текућем окружењу ("source ime_fajla" извршава редом команде из фајла).

$ test -x /bin/ls || echo "/bin/ls nije izvrsiv fajl"

Ако "/bin/ls" није извршив онда штампа поруку на стандардном излазу о грешци.

Да би сте сазнали више о уграђеним командама користите уграђену команду help.

$ help test
test: test [expr]
    Exits with a status of 0 (true) or 1 (false) depending on
    the evaluation of EXPR.  Expressions may be unary or binary.  Unary
    expressions are often used to examine the status of a file.  There
    are string operators as well, and numeric comparison operators.
    ... Излаз ове команде је скраћен због читљивости ...

Контрола послова

У командном окружењу можемо да извршавамо више послова истовремено, да паузирамо програме који нам нису тренутно потребни. Ако желимо да извршимо неку наредбу у позадини ставићемо на крају наредбе "&" знак, ово можемо да радимо само ако је упитању наредба која није интерактивна (не тражи унос од корисника). Ако то урадимо са интерактивном наредбом само ћемо да је пошаљемо на спавање пошто ће она да чека на унос корисника.

Kомандама "bg" и "fg" можемо да шаљемо послове у позадину или први план. Све послове листамо командом "jobs". При листању послова видећемо да сваки посао има свој број, када задајемо послове које ћемо да пошаљемо у позадину или у први план морамо да ставимо знак "%" испред броја (не морамо да наводимо број посла ако је он текући, има + десно од броја посла).

$ jobs
[1]-  Stopped                 vim
[2]+  Stopped                 less /etc/X11/xorg.conf
$ fg %1

Ако желимо да зауставимо неки програм, нпр. нека наредба се дуго извршава, и да је ставимо у позадину можемо то да урадимо пречицом "Ctrl+z".

$ ls -R /
[1]+  Stopped                 ls -R

$ jobs
[1]+  Stopped                 ls -R

$ bg

Пошто наредба листа рекурзивно ("-R") све директоријуме на вашем систему и треба јој много времена да се изврши можете да притисните поменуту пречицу "Ctrl+z" и да је зауставите, и онда да је ставите у позадину наредбом "bg".

Преусмеравање улаза/излаза

Сви знамо, интуитивно, да један швајцарски нож са свим његовим додацима може да служи само за неке тривијалне послове. Столар например неће узети да прави сто са швајцарским ножем, него ће имати све алате засебно (тестеру, чекић,...). Пројектанти Јуникса су такође увидели да један вишенаменски алат не може да се пореди са спајањем више специјализованих алата. Један од механизама комуникације међу њима је и преусмеравање излаза једне наредбе у улаз друге.

Преусмеравање радимо преко цеви (енг. "pipe") и наводимо редом програме и између њих стављамо "|" знак. Сваки програм шаље свој излаз следећем програму у низу. Ако имамо проблем сортирања наслова по лексикографском поретку, довољно је проследити наредби "sort" текст који треба да се сортира.

$ ls / | sort
bin
boot
cdrom
dev
etc
...

Ако је излаз наредбе предугачак можемо да га преусмеримо у програм "more" или "less". Програм "less" за разлику од "more" дозвољава произвољно шетање по баферу.

$ ls | less

Можемо такође, ако је то потребно да излаз сачувамо у посебан фајл за каснију анализу, или да из фајла читамо улаз за наредбу. Ово радимо са два оператора ">", "<".

$ naredba1 > izlaz.txt
$ naredba2 < ulaz.txt

Стартовање

Када се "Bash" стартује у интерактивном моду он извршава команде из фајлова "/etc/bash.bashrc" и "~/.bashrc". Овде можемо да мењамо променљиве, да извршавамо неке програме при стартовању, намештамо алијасе за честе команде,... Сад ћу да наведем пример простог ".bashrc" фајла, овде сам увелико скратио оригинални фајл због јасноће.

# Ako ga ne pokrecemo interaktivno ne radi nista
# Pri interaktivnom koriscenju komandnog okruzenja je
# definisana promenljiva PS1
[ -z "$PS1" ] && return


# Namesta PS1 sa raznim bojama,...
# Ako vas interesuje sta znaci \[\033[... u definicije promenljive, to su inace Escape sekvence
# koje prepoznaje terminal. Te sekvence mu kazu kada da pocne da boji neki tekst, i kada da prestane
# Ovo je trivijalno objasnjenje, pogledajte vise na netu ako vas interesuje.
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\H\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '


# Neki aliasi za ceste komande
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'

# Namestamo podrazumevani Editor
EDITOR=vim

# Dodao sam ~/bin direktorijum u izvrsnu putanju
PATH="$PATH:~/bin/"
# Alias da vidim promene preko SVN-a
alias change="svn diff|less"
# Umask, vidi gore
umask 077

Везе

Спољашње везе

Личне алатке
Именски простори
Варијанте
Акције
Навигација
Алатке