Professional Documents
Culture Documents
LINUX Kartulad
LINUX Kartulad
ხო
ვთ ეს
ar შე არ
ch ნი ის
შვ სა
il. ნე
eliz ბი მუ
შა
ba მო ო
1
ra მწ ვე
ნაწილი I
sh ერ რ
vi
li@ ე თ
სი
ა!
ელ
არჩილ ელიზბარაშვილი
bt
u. .
ფ
შესავალი GNU/Linux სისტემებში
ed ო
u. სტ
ge ა ზე
:
გთ
ხო
ვთ ეს
ar შე არ
ch ნი ის
შვ სა
il. ნე
eliz ბი მუ
შა
ba მო ო
ra მწ ვე
sh ერ რ
vi
li@ ე თ
სი
ა!
bt ელ
u. .
ფ
ed ო
u. სტ
ge აზე
:
სარჩევი
:
ა ზე
სტ
I შესავალი GNU/Linux სისტემებში
არჩილ ელიზბარაშვილი 1
ა!
ო
სი
ფ
1. კომპიუტერის შექმნიდან დღემდე 5
1.1 Unix-ის ეპოქის დასაწყისი . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
ge
1.2 Unix-ის მსგავსი სისტემები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
.
ელ
1.3 პროგრამები და ლიცენზიები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
ვე
u.
1.4 თავისუფალი პროგრამების განვითარება . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5 ლინუქსის ისტორია . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
ო
ed
თ
2. ბრძანებათა ხაზი 19
შა
2.1 ე
shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
u.
ერ
2.2 ლინუქსის საბაზისო ბრძანებები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
მუ
bt
მწ
3. სისტემის სტრუქტურა 27
სა
li@
4. მოქმედებები ფაილებზე 33
მო
vi
sh
5. გადამისამართება 43
ნე
ra
შვ
liz
6. ბრძანებების გადაბმა 49
შე
6.1 ოპერატორები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.2 მილი . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
e
il.
ვთ
7. ტექსტური რედაქტორები 55
ch
ar
8. წვდომის უფლებები 67
გთ
9. პროცესები 79
9.1 ფონური რეჟიმი . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3
9.2 სიგნალები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9.3 პროცესის პრიორიტეტები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
:
ზე
11. ტექსტის დამუშავება 113
11.1 tac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
ა
11.2 head, tail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
სტ
11.3 sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
11.4 uniq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
ა!
11.5 cut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
ო
11.6 paste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
სი
ფ
11.7 join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
11.8 tr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
ge
.
ელ
12. სხვა სასარგებლო ბრძანებები
ვე 129
u.
12.1 ტექსტის შედარება . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
12.2 find . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
ო
ed
თ
12.3 split . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
შა
u.
ერ
12.5 xargs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
მუ
bt
12.7 fmt, nl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
მწ
სა
12.8 od . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
li@
12.9 date, cal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
მო
ის
sh
ba
15.2 at . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
ch
ხო
4
16.6 არითმეტიკული გამოთვლები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
16.7 სპეციალური ცვლადები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
16.8 ფუნქციები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
16.9 სკრიფტის ოფციები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
:
ზე
17.2 ANSI კოდები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
17.3 კურსორის მართვა . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
ა
17.4 ტერმინალის მულტიპლექსერები . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
სტ
18. მასივები 319
ა!
18.1 ასოციაციური მასივი . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
ო
სი
ფ
სათაური 325
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
5
გთ
ხო
ვთ ეს
ar შე არ
ch ნი ის
შვ სა
il. ნე
eliz ბი მუ
შა
ba მო ო
ra მწ ვე
sh ერ რ
vi
li@ ე თ
სი
ა!
bt ელ
u. .
ფ
ed ო
u. სტ
ge აზე
:
თავი 1
:
ა ზე
კომპიუტერის შექმნიდან დღემდე
სტ
ა!
ო
სი
ფ
ოდის შეიქმნა პირველი კომპიუტერი? ერთ-ერთი ფართოდ გავრცელებული მოსაზრე-
რ ბით, პირველი კომპიუტერი ჩარლს ბებიჯმა (Charles Babbage) 1822 წელს შექმნა.
ge
.
ელ
თუმცა, მას დღევანდელ კომპიუტერთან საერთო ბევრი არაფერი აქვს. ეს იყო პირვე-
ვე
ლი მექანიკური ავტომატური გამომთვლელი მანქანა, რომელიც ითვლიდა რიცხვებს.
u.
საბოლოოდ, უსახსრობის გამო, ბებიჯმა ვერ შეძლო სრულად ფუნქციონირებადი მანქანის შექ-
ო
ed
მნა.
თ
თავად სიტყვა კომპიუტერი (computer) პირველად 1613 წელს გამოჩნდა და მას უწო-
შა
ე
დებდნენ ადამიანს, რომელიც გამოთვლას, დათვლას აწარმოებდა. მე-19 საუკუნის ბოლოსკენ,
u.
ერ
ინდუსტრიული რევოლუციის შემდეგ, ამ ტერმინით უკვე მოწყობილობებს მოიხსენიებდნენ.
მუ
bt
1936 წელს ალან ტიურინგმა (Alan Turing) წარმოადგინა ახალი მანქანის იდეა. მას
მწ
li@
ადგენდა და დღესაც, თანამედროვე კომპიუტერების მუშაობის პრინციპი ტიურინგის მანქანის
მო
კონცეფციაზეა დამყარებული.
ის
იმავე წელს, გერმანელმა ინჟიმერმა კორნად ცუზემ (Kornad Zuse) დაიწყო პირველი
vi
გამოიყენებოდა რელეები.
ნე
1937 წელს პროფესორმა ჯონ ვინსენტ ათანასოვმა (John Vincent Atanasoff) და მისმა
ra
ეს
სტუდენტმა კლიფ ბერიმ (Cliff Berry) დაიწყეს ახალი კომპიუტერის, ABC-ის (Atanasoff-Berry
შვ
ლოსს (Colossus) მიიჩნევს. ის ტომი ფლაუერსმა (Thomas (Tommy) Harold Flowers) შექმნა
1943 წელს იმ მიზნით, რომ მეორე მსოფლიო ომის მსვლელობისას გერმანელების მიერ გა-
ch
1
შეტყობინებების დაშიფრვა ხდებოდა ლორენცის მანქანით. ბრიტანელმა კრიპტოანალიტიკოსებმა მოახერხეს ამ
დაშიფრული ინფორმაციის მოპოვება, მისი ლოგიკური სტრუქტურის შესწავლა და შეტყობინებების წაკითხვა. ამ მოვ-
ლენიდან მხოლოდ 3 წლის შემდეგ შეძლეს ფიზიკურად ენახათ ლორენცის მანქანა.
2
ენიგმას მანქანები - ელექტრო-მექანიკური დაშიფრვის მანქანები პირველი მსოფლიო ომის შემდეგ შეიქმნა გერ-
მანიაში და ისინი მე-20 საუკუნის დასაწყისში გამოიყენებოდა სამხედრო, დიპლომატიური და კომერციული ინფორმა-
ციული კომუნიკაციების დასაცავად. მეორე მსოფლიო ომის დროს გერმანელი სამხედროები ამ მანქანით შიფრავდნენ
7
ამ პერიოდის ცნობილი კომპიუტერი იყო ENIAC (Electronic Numerical Integrator
and Calculator). ისიც, როგორც კოლოსი და ბომბი, სამხედრო მიზნებისთვის, კონკრეტულად
– ბალისტიკური რაკეტის ტრაექტორიის გამოსათვლელად, შეიქმნა პენსილვანიის უნივერსი-
ტეტში პრესპერ ეკერტისა (Presper Eckert) და ჯონ მოჩლის (John Mauchly) მიერ 1943-1946
წლებში. ENIAC ზომაში ძალიან დიდ მანქანას წარმოადგენდა. ის დიდ ფართზე იყო განთავსე-
ბული, შეიცავდა 18 000 ვაკუუმურ მილაკს, მოიხმარდა 180 000 ვატს და იწონიდა 50 ტონას.
ამასთან ერთად, ის იყო სრულად ფუნქციონირებადი და 1000-ჯერ სწრაფი კომპიუტერი, ვიდრე
:
ზე
მისი წინამორბედი ელექტრომექანიკური მანქანები, რის გამოც ბევრი სპეციალისტი, სწორედ
ENIAC-ს მიიჩნევს პირველ ციფრულ კომპიუტერად3 .
ა
მას შემდეგ კომპიუტერის უამრავი ვარიანტი შეიქმნა, რომელთაც თან ახლდა ახალი
სტ
ტექნოლოგიური სიახლეები განვითარების სხვადასხვა ეტაპზე. შესაბამისად, კომპიუტერები
შეიძლება რამდენიმე თაობად დავყოთ: პირველი თაობის კომპიუტერები, რომლებიც მუშაობ-
ა!
ო
დნენ ელექტრონულ-ვაკუუმურ მილაკებზე (თუ არ ჩავთვლით მექანიკურ და ელეტრომექანიკურ
მანქანებს). სწორედ ამ თაობის კომპიუტერებია ABC, კოლოსი და ENIAC. მეორე თაობის კომ-
სი
ფ
პიუტერებში (1947 წლიდან) ვაკუუმური მილაკები ტრანზისტორებმა ჩაანაცვლეს. ამ თაობის
წარმომადგენელია IBM4 -ის 701. ეს მოდელი იყო IBM-ის პირველი კომერციული სამეცნიერო
ge
.
ელ
კომპიუტერი. მესამე თაობის კომპიუტერებში, რომლებიც 1963 წლიდან დღემდე არსებობს,
ვე
გამოიყენება ინტეგრირებული მიკროსქემები (ე.წ. მიკროჩიპი ან უბრალოდ ჩიპი). ჩიპებმა შეიძ-
u.
ლება დაიტიონ რამდენიმე მილიარდი ტრანზისტორი. სწორედ, მათი წყალობით გახდა კომპიუ-
ო
ტერები ზომაში გაცილებით პატარა და მძლავრი. შემდეგი თაობის კომპიუტერი, სავარაუდოდ,
ed
თ
კვანტური კომპიუტერი იქნება. ეს ტექნოლოგია ჯერ კიდევ განვითარების სტადიაშია და მას
შა
u.
ერ
მუ
bt
1.1 Unix-ის ეპოქის დასაწყისი
მწ
სა
li@
გამოთვლითი მოწყობილობების განვითარებასთან ერთად პარალელურად ვითარდე-
მო
sh
ra
ba
liz
ჩუსეტში და MIT5 -ის თაოსნობით ხორციელდებოდა General Electric6 -სა და AT&T Bell Labs7 -
il.
ვთ
ch
შეტყობინებებს და ისე უზგავნიდნენ ერთმანეთს. არსებობდა აგრეთვე ენიგმას იაპონური და იტალიური მოდელებიც.
3
პირველი ელექტრონული კომპიუტერის პატენტი პრესპერ ეკერტსა და ჯონ მოჩლის გადაეცათ, თუმცა, მოგვიანე-
ხო
ბით, ა.შ.შ.-ს სასამართლოს განჩინებით, მათ ჩამოერთვათ და პატენტი გადაეცა ჯონ ათანასოვს, ABC-ის შემქმნელს.
ar
4
IBM (International Business Machines) - კომპიუტერული ტექნიკისა და პროგრამული უზრუნველყოფის ერთ-
ერთი უმსხვილესი მწარმოებელი კორპორაცია.
გთ
5
MIT - Massachusetts Institute of Technology, მასაჩუსეტსის ტექნოლოგიური ინსტიტუტი არის ძალიან ცნობილი
კერძო სასწავლო, კვლევითი უნივერსიტეტი კემბრიჯში, მასაჩუსეტსი, აშშ.
6
General Electric (GE) - ჯენერალ ელექტრიკი არის ამერიკული კორპორაცია (კემბრიჯი, მასაჩუსეტსი), რომელიც
აწარმოებს ტექნიკის ფართო სპექტრს.
7
AT&T Bell Labs ერთ-ერთი ძველი დასახელებაა დღევანდელი Nokia Bell Labs-ის. მას სხვადასხვა პერიოდებში
აგრეთვე ერქვა Bell Telephone Laboratories და Bell Labs. AT&T Bell Labs არის კვლევითი და სამეცნიერო განვი-
თარების ამერიკული კომპანია. მოგვიანებით დაიყო ორად (Bell Labs და AT&T Laboratories). ის მდებარეობს აშშ-ში
8
თან თანამშრომლობით. 1969 წელს Bell Labs გამოეყო პროექტს.
1969-1970 წლებში, კენეტ (კენ) ტომპსონმა (Kenneth Thompson) და დენის რიჩიმ
(Dennis Ritchie), რომლებიც MULTICS-ის პროექტის თანამონაწილენი იყვნენ, AT&T Bell
Labs-ში გადაწყვიტეს მსგავსი ოპერაციული სისტემის დაწერა პატარა მასშტაბით PDP-7-
ზე8 ასემბლერის9 გამოყენებით. სულ მალე ოპერაციულ სისტემას დაარქვეს სახელი Unics
(UNiplexed Information and Computing Service), როგორც MULTICS-ის კალამბური, მოგ-
ვიანებით კი Unix. ასემბლერზე დაწერილი პროგრამა ნიშნავდა იმას, რომ ეს პროგრამა სხვა
:
ზე
არქიტექტურის კომპიუტერზე ვერ გაეშვებოდა. ამასობაში, ტომპსონი და რიჩი ქმნიან დაპროგ-
რამების ენას C, რომლის მიზანიც არის პორტატული პროგრამის დაწერა. 1972-1973 წლებში
ა
სისტემა გადაიწერა C ენაზე და დაემატა ბევრი ახალი ფუნქციონალი. 1971-1979 წლებში პრო-
სტ
დუქტი გამოდიოდა Unix Time-Sharing System V1, V2, V3, V4, V5, V6 და V7 დასახელებებით.
1975 წელს კენ ტომპსონი Bell Labs-დან გადავიდა ბერკლიში (Berkeley), კალიფორ-
ა!
ო
ნიის უნივერსიტეტში,10 როგორც მოწვეული პროფესორი. ის დაეხმარა Unix V6-ის დაყენებაში
და ამ სისტემისთვის დაიწყო დაპროგრამების ენა - პასკალის (Pascal) შექმნა. მოგვიანებით ჩაკ
სი
ფ
ჰალიმ (Chuck Haley) და ბილ ჯოიმ (Bill Joy) გააუმჯობესეს ტომპსონის პასკალი და ამავდროუ-
ლად, შექმნეს გაუმჯობესებული ტექსტური რედაქტორი სახელად ex. 1978 წელს კალიფორნიის
ge
.
ელ
უნივერსიტეტის კომპიუტერული სისტემების კვლევის ჯგუფმა გამოუშვა პირველი პროდუქტი
ვე
Berkeley Software Distribution (1BSD). 1BSD დაშენებული იყო Unix V6-ის საწყის კოდზე.
u.
მისი მეორე ვერსია - 2BSD 1979 წელს გამოვიდა. პირველი ვერსიის განახლებების გარდა, იგი
ო
ed
შეიცავდა ბილ ჯოის ორ ახალ პროგრამას: vi ტექსტურ რედაქტორს, რომელიც ex-ის ვიზუა-
თ
ლურ ვერსიას წარმოადგენდა და C shell-ს.
შა
ე
1977-1979 წლებში, კენ ტომპსონმა და დენის რიჩიმ ხელახლა გადაწერეს Unix, რათა
u.
ერ
მეტად პორტატული გაეხადათ და AT&T Bell Labs 80-იანი წლების დასაწყისში გამოუშვეს Unix-
მუ
bt
ის განახლებული ვარიანტი System III -ს. ამასობაში Bell Labs გამოეყო AT&T კომპანიას. ამ
”
მწ
გამოყოფას უფრო სტრატეგიული დანიშნულება ჰქონდა. საქმე ის იყო, რომ AT&T წარმოად-
სა
li@
გენდა (და წარმოადგენს) უმსხვილეს სატელეკომუნიკაციო კომპანიას, რომელიც ფლობდა Bell
მო
და მთავრობა მას მკაცრად აკონტროლებდა. Bell Labs კი მხოლოდ კვლევით ცენტრს წარ-
vi
საწყის ეტაპზე Unix-ის სისტემები AT&T Bell Labs-დან შეიცავდა ოპერაციული სის-
ba
და ეკუთვნის ფინურ კომპანია Nokia-ს. მისი ლაბორატორიები მსოფლიოს სხვადასხვა ქვეყანაშია განაწილებული.
ar
ისტორიული ლაბორატორია (Volta Laboratory and Bureau) ჯერ კიდევ მე-19 საუკუნეში შექმნა ალექსანდრე ბელმა
(Alexander Graham Bell). Bell Labs იმითაც არის ცნობილი, რომ იქ შეიქმნა ტრანზისტორი, ლაზერი, განაწილებული
გთ
9
1984 წელს დაარსდა X/Open ჯგუფი. მისი წევრები იყვნენ ინფორმატიკაში მომუშავე
კომპანიები. X/Open ჯგუფის მიზანი იყო Unix-ის სხვადასხვა ვერსიის ნორმალიზება, რათა გაე-
ზარდათ მათ შორის თავსებადობა და შეემცირებინათ პორტირების ხარჯები. ამ ჯგუფის გარდა,
აგრეთვე ამავე მიზნებისთვის ჩამოყალიბდა ჯგუფი POSIX11 , რომელიც IEEE12 ასოციაციის ნა-
წილია. ეს ორი ჯგუფი გახდა სტანდარტიზაციის ნამდვილი ორგანიზმი, თუმცა POSIX-ის მიერ
გაწეული სამუშაოები უფრო გადამწყვეტი აღმოჩნდა. თუ მწარმოებლები ამ სტანდარტს გაით-
ვალისწინებდნენ, ოპერაციულ სისტემებს შორის თავსებადობა გარანტირებული იქნებოდა.
:
ზე
ამავე წელს MIT-ში იქმნება X Window - მრავალფანჯრიანი გრაფიკული სისტემა. ეს
სისტემა Unix-სგან დამოუკიდებელი იყო, თუმცა მის წარმატებაში დიდი წვლილი შეიტანა.
ა
1987 წელს AT&T (Unix-ის მფლობელი) და Sun (კომპიუტერების მწარმოებელი ერთ-
სტ
ერთი ლიდერი კომპანია, რომელიც იყენებდა BSD-ს) ქმნიან ალიანსს, რათა მოახდინონ ორი
სისტემის შერწყმა. 1988 წელს იქმნება ორი კონსორციუმი:
ა!
ო
OSF (Open Software Fondation) (წევრები: DEC, HP, IBM, . . . ), სადაც მუშაობენ ახალი
სი
ფ
Unix-ის ნორმალიზებაზე და რომელიც მონათლეს OSF1 სახელით.
Unix International (წევრები: AT&T, Sun, . . . ), რომლის მიზანიცაა Unix system V-ის
ge
.
ელ
პოზიციების გამყარება.
ვე
u.
1992 წელს გამოდის OSF-ის პირველი, კომერციულად ხელმისაწვდომი სისტემის ვერ-
სია DEC/OSF1 დასახელებით, ხოლო Sun უშვებს System V-სა და BSD-ს პირველ შერწყმულ
ო
ed
თ
კომერციულ ვერსიას. ზოგადად, 1980-იანი წლების ბოლოსა და 1990 წლების დასაწყისში
შა
ე
AT&T-სა და Berkeley-ს შორის დიდი ომი იყო გაჩაღებული ბაზარზე პირველობის მოსაპოვებ-
u.
”
ერ
ლად. კომერციული თვალსაზრისით შეიძლება ჩავთვალოთ, რომ ომში System V -მ იმარჯვა,
მუ
” ”
რადგან ტექნიკის მწარმოებლების (hardware vendors) უმრავლესობა AT&T-ს System V -ზე
bt
”
გადაერთო. თუმცა, BSD სისტემაც ფართოდ გამოიყენებოდა მკვლევარებს შორის პერსონა-
მწ
სა
li@
ლურ კომპიუტერებსა და პირადი გამოყენების სერვერებზე. ერთი კი აღსანიშნავია - მრავალი
მო
vi
კუთვნილი Unix-ის საწყის კოდებს. ამან საგრძნობლად შეაფერხა BSD სისტემის განვითარება.
sh
1995 წელს მისი ბოლო ვერსია - 4.4BSD-Lite Release 2 გამოვიდა ბერკლიში. შემდეგ კი კომპი-
ნე
BSD-ს ლიცენზიის დამთმობმა მხარემ საშუალება მისცა ბევრი სხვა კომპანიის საკუთრებაში
შვ
TCP/IP-ის დანერგვის დროს. ასევე, BSD-ს უამრავი კოდი აქვს ჩაშენებული Apple-ის MacOS-სა
liz
და Solaris-ს.
შე
სისტემებს, რომლებსაც ორიგინალი Unix-ის მსგავსი სტრუქტურა აქვთ. მასში ასევე მოიაზრება
ar
11
POSIX - Portable Open System Interface eXchange
12
IEEE - Institute of Electrical and Electronics Engineers
13
კლონი არის პროგრამა (ოპერაციული სისტემა ან სხვა), რომელსაც ორიგინალის მსგავსი ქცევა და ფუნქციონალი
აქვს და არ შეიცავს საწყის კოდებს.
10
Solaris 1983 წელს კომპანია Sun Microsystems-მა გამოუშვა BSD-ს ვარიანტი
SunOS, რომელიც გათვალისწინებული იყო SPARC პლატფორმის სერვე-
რული ტიპის კომპიუტერებისთვის. 1992 წელს კომპანიაში დაიწყეს ახალი,
უფრო თანამედროვე Unix-ის მსგავსი ვერსიის შექმნა, რომელსაც უწო-
დეს Solaris. ამჟამად ის ცნობილია როგორც Oracle Solaris, რადგან Sun
:
Microsystems 2010 წელს კომპანია Oracle-მა შეიძინა.
ზე
macOS თანამედროვე მაკინტოშის სისტემების შექმნაც Unix-დან იღებს სათავეს.
ა
კომპანია Apple 1997 წელს NeXT-ის შეძენასთან ერთად დაეუფლა ოპერა-
სტ
ციული სისტემა NeXTSTEP-ს, რომელიც წარმოებულია BSD-ს ადრეული
ვერსიისგან. კომპანიაში 2001 წელს სისტემა სრულად განაახლეს და გამო-
ა!
ო
უშვეს Mac OS X, რომელიც ასევე დაფუძნებულია Unix-ის მსგავს სისტემა
Darwin-ზე (მოხალისეების მიერ შექმნილი). 2012 წელს Mac OS X-ს შეუც-
სი
ფ
ვალეს დასახელება OS X-ით. 2016 წლიდან მისი ოფიციალური სახელია
macOS.
ge
.
ელ
AIX
ვე
ეს სისტემა კომპანია IBM-მა განავითარა, რომელიც ძირთადად IBM-ის
u.
mainframe-სა და PowerPC-ზე მუშაობს.
ო
ed
HP-UX კომპანია Hewlett-Packard-ის მიერ მხარდაჭერილი სისტემაა, რომელიც
თ
გამოიყენება HP 9000 ხაზის Workstation-სა და სერვერებზე.
შა
u.
Minix მიკრობირთვიანი ოპერაციული სისტემაა, რომელიც ძირითადად საგანმა-
ერ
მუ
bt
მწ
li@
სმარტფონებისთვის. BlackBerry 10 დაფუძნებულია Unix-ის მსგავს QNX
მო
სისტემაზე.
ის
პროცესორებისთვის.
ბი
არ
sh
მიერ.
ra
ეს
შვ
შეისყიდა.
11
თადი ამოცანებია მომხმარებლებთან ურთიერთობა და კომპიუტერული რესურსების მართვა.
მაგალითად, მომხმარებლის მიერ კლავიატურიდან (ან შეტანის სხვა მოწყობილობიდან) შე-
ტანილი ინფორმაციის გაგება, მისი დამუშავება და მიღებული შედეგის გამოტანა მონიტორის
ეკრანზე (ან სხვა გამომტან მოწყობილობაზე). ოპერაციული სისტემა არის დამაკავშირებელი
რგოლი, შუამავალი, ინტერფეისი მომხმარებელსა და კომპიუტერს შორის. ის აგებინებს კომ-
პიუტერს მომხმარებლის ნათქვამს და პირიქით.
”
მინიმალისტური ოპერაციული სისტემის მოდელი რომ წარმოვიდგინოთ, ის უნდა შედ-
:
ზე
გებოდეს შემდეგი ნაწილებისგან (იხილეთ სურ. 1.1):
ა
ბირთვი (kernel) - ეს არის ოპერაციული სისტემის ძირითადი პროგრამა. ის წარმოად-
სტ
გენს დამაკავშირებელ რგოლს კომპიუტერის პროგრამულ (software) და აპარატურულ
(hardware) ნაწილებს შორის. თვალსაჩინოებისთვის წარმოვიდგინოთ შემდეგი სცენარი:
ა!
თქვენ გახსენით ფაილი ერთერთ ტექსტურ რედაქტორში, აკრიფეთ ტექსტი და შემდეგ
ო
შეინახეთ ფაილი USB ფლეშ მოწყობილობაზე. პროგრამა, ამ შემთხვევაში ტექსტური
სი
ფ
რედაქტორი, ამ ოპერაციის შესასრულებლად (ფაილის შესანახად) მიმართავს ბირთვს.
ოპერაციის სპეციფიკურობა, თუ როგორ და რანაირად უნდა შეინახოს ფაილი USB ფლეშ
ge
.
მოწყობილობაზე, უცნობი რჩება როგორც ტექსტური რედაქტორისთვის, ასევე მომხმა-
ელ
რებლისთვის. ამას აგვარებს ბირთვი.
ვე
u.
ბრძანებათა ხაზი (shell) - ეს არის ის გარსი, სადაც სრულდება მომხმარებლის მიერ მი-
ო
ed
თ
თითებული ბრძანებები. მომხმარებელს პირდაპირი წვდომა არ აქვს ბირთვთან, არამედ
შა
u.
ნიჟარა და მხოლოდ ამ ნიჟარის გავლით შეუძლია მომხმარებელს ბირთვთან ინტერაქცია.
ერ
მუ
bt
ბრძანებათა ხაზს Shell-ს.
მწ
სა
li@
თავად ბრძანებები - ბინარული ფაილები, გამშვები ფაილები, პროგრამები.
მო
ის
შესაძლებელია. მათ ასევე შეიძლება ვუწოდოთ აპლიკაცია, პროგრამა ან სკრიპტი. თუმცა, რო-
ბი
არ
ბინარული ფაილი იმიტომ ჰქვია, რომ მისი შიგთავსი პირდაპირ კომპიუტერისთვის გა-
ნე
12
ამ დონეზე მომხმარებელი თავად
უშვებს ბრძანებებს.
:
ზე
მომხმარებელი
User
ბრძანებათა ხაზი
ა
Shell
სტ
ბირთვი
Kernel
ა!
ო
აპარატურა
Hardware
სი
ფ
რ
ge
.
ელ
ვე
u.
ო
ed
თ
შა
ე
შუამავალი მომხმარებელსა და ბირთვს შორის.
u.
ერ
ოპერაციული სისტემის ძირითადი ნაწილი, რომელიც ის უთარგმნის ბირთვს მომხმარებლის მიერ გადა-
მუ
bt
მულ უზრუნველყოფას შორის. პასუხს უკან უბრუნებს მომხმარებელს.
მწ
სა
li@
მო
vi
ბი
არ
ra
ეს
ba
გამოყენების უფლებას გვაძლევს. როგორც წესი, მას ახლავს შეზღუდვები. მაგალითად, ხშირად
liz
13
დროის განმავლობაში უფასოდ მოგვეცემა, ხოლო freeware, როგორც თვითონ სიტყვიდან ჩანს,
უფასოა.
ეს კომპიუტერული პროგრამები ისევე დახურულია, როგორც სხვა მესაკუთრეობრივი
პროგრამები. თუ ოდესმე ავტორმა შეწყვიტა მისი განვითარება - საფრთხე, რომელიც ბევრ
shareware-ს ემუქრება - სხვა ვერავინ შეძლებს მათ განახლებაზე ზრუნვას.
:
1.3.3 თავისუფალი პროგრამული უზრუნველყოფა
ზე
პროგრამას ვუწოდებთ თავისუფალს, თუ ის რამდენიმე კრიტერიუმს აკმაყოფილებს:
ა
სტ
მოიცემა თავის საწყის კოდთან ერთან, რომელშიც შესაძლებელია ცვლილების შეტანა.
შესაძლებელია მისი გავრცელება შეზღუდვის გარეშე.
ა!
ო
შესაძლებელია იმ ცვლილებების გავრცელებაც, რომელიც კოდში შევიტანეთ.
სი
ფ
რა თქმა უნდა, თავისუფალ პროგრამებსაც აქვთ თავიანთი ლიცენზიები. ასეთ ლიცენ-
ge
.
ზიებს შორის ერთ-ერთი ყველაზე ცნობილია GPL (General Public License). ამ ლიცენზიით გა-
ელ
მოდის ბევრი თავისუფალი პროგრამული უზრუნველყოფა, მაგალითად ლინუქსი (Linux), კომ-
ვე
u.
პილატორი GCC (GNU Compillr Collection) და სხვა. ეს ლიცენზია იძლევა საშუალებას, რომ
მომხმარებელმა საწყისი კოდი შეისწავლოს, მასში ცვლილები შეიტანოს და გააზიაროს. თუმცა,
ო
ed
თ
სავალდებულოა, შეცვლილი პროგრამა გავრცელდეს ლიცენზიით თავდაპირველი მინიჭებული
შა
u.
და გავხადოთ მესაკუთრეობრივი. ამგვარად, GPL ლიცენზიის ქვეშ მყოფი პროგრამების გან-
ერ
მუ
bt
პროგრამებისადმი, სხვებს შეეძლებათ განაგრძონ მათი განვითარება.
მწ
li@
სიტყვის თამაშიდან მიღებული ტერმინია. Copyleft ლიცენზიებში მოითხოვება ორიგინალიდან
მო
sh
თავად გვთავაზობენ:
ნე
შვ
ბის განმავლობაში ისინი ხშირად იცვლებოდნენ, რამაც ბევრი ახალი ლიცენზიის შექ-
e
”
ოთხ-პუნქტიანი BSD ლიცენზია (four-clause BSD license). ყველა მათგანი BSD-ს
ch
” ”
ტიპის ლიცენზიის სახელით არის ცნობილი. ბევრი პროგრამა - ოპერაციული სის-
ხო
ტემები FreeBSD, OpenBSD და NetBSD, ვებ სერვერი Nginx, Chromium ვებ ბრაუ-
ar
16
Copyright ანუ საავტორო უფლებები არის უფლებები, რომელიც წარმოეშვება ავტორს მის მიერ შექმნილ ნაწარ-
მოებთან დაკავშირებით. საავტორო უფლებების დაცვის ნიშანია ©.
14
მასაჩუსეტსის ტექნოლოგიის ინსტიტუტში და ცნობილია X11 და MIT X დასახელე-
ბებითაც.
– Apache ლიცენზია - Apache Software Foundation (ASF)-ის მიერ შექმნილი ლი-
ცენზიაა. სადღეისოდ, ლიცენზიის ბოლო ვერსიაა 2.0. Apache HTTP Server და
OpenOffice სწორედ ამ ლიცენზიით გამოდის.
– Public domain - აქ ნაშრომის განთავსება ნიშნავს, რომ ნებისმიერს, ნებისმიერი
:
მიზნებისთვის შეუძლია მისი თავისუფლად გამოყენება.
ზე
ნაკლებ ამკრძალავი ლიცენზიები (ნაკლებ Copyleft ლიცენზიები):
ა
– MPL (Mozilla Public License) - Mozilla ფონდის მიერ შექმნილი ლიცენზია. ლი-
სტ
ცენზიის სადღეისოდ ბოლო ვერსიაა 2.0. ამ ლიცენზიით გამოდის Mozilla Firefox,
Mozilla Thunderbird და Mozilla-ს სხვა პროგრამები.
ა!
ო
– GNU LGPL (GNU LESSER GENERAL PUBLIC LICENSE) - არის თავისუფალი
პროგრამების ფონდში (Free Software Foundation - FSF) შექმნილი ლიცენზია. ის
სი
ფ
საშუალებას იძლევა პროგრამის ინტეგრირება მოხდეს სხვა პროგრამებში (თუნდაც
მესაკუთრეობრივში), ისე რომ არ მოითხოვოს სხვა კომპონენტების კოდის გახსნა.
ge
.
ელ
ბევრი მესაკუთრეობრივი პროგრამა იყენებს LGPL-ის ლიცენზიების მქონე კოდებს,
ვე
ძირითადად გაზიარებული ბიბლიოთეკების (shared library) ფორმით.
u.
ძლიერ ამკრძალავი ლიცენზიები (Copyleft ლიცენზიები):
ო
ed
თ
– GNU GPL - არის Free Software Foundation (FSF)-ში შექმნილი ლიცენზია. ეს
შა
u.
ერ
სიის შემდეგ, რომელიც რიჩარდ სტალმანმა შექმნა, გამოვიდა კიდევ ორი - GNU
მუ
bt
– Affero GPL - Affero General Public License. ეს ლიცენზია სპეციალურად შეიქმნა
მწ
სა
რამას, შეეძლოს მისი საწყისი კოდის მიღება. FSF-ის მიერ გამოცემული ბოლო ვერ-
ის
vi
sh
ba
პირადი მიზნებისთვის?
e
პროგრამის საწყისი კოდი დავხუროთ? აუცილებლად უნდა მოვაყოლოთ თუ არა ლიცენზიის ასლი
ვთ
აქვს თუ არა უფლება მიიღოს საწყისი კოდის ასლი? იმავე ან მსგავსი ლიცენზიით უნდა იყოს თუ
ხო
15
უფლებები გავრცელების პირობები შეზღუდვები
პასუხისმგებლობის არიდება
გარანტიის არარსებობა
კომერციული მიზნები
კოდის ცვლილება
პირადი მიზნები
დაპატენტება
გავრცელება
:
ა ზე
სტ
ა!
ო
სი
ფ
BSD 2-clause Simplified License ◦ ◦ ◦ ◦ ◦ ◦ ◦
”
ge
.
BSD 3-clause Clear License ◦ ◦ ◦ 17 ◦ ◦ ◦ ◦
ელ
არა
ვე
u.
BSD 3-clause New or Revised ◦ ◦ ◦ ◦ ◦ ◦ ◦
” ”
License
ო
ed
თ
◦ ◦ ◦ ◦ ◦ ◦ ◦
შა
MIT License
u.
ერ
მუ
bt
მწ
სა
◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
li@
GNU LGPLv3
მო
◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
ის
GNU GPLv2 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
sh
ნე
GNU GPLv3 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
ra
ეს
შვ
◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
ba
GNU AGPLv3
ნი
liz
შე
1983 წელს რიჩარდ სტალმანი (Richard Stallman) იწყებს ახალ პროექტს სახელწო-
il.
ვთ
ფაქტმა იმდენად დიდი პროტესტის გრძნობა გააჩინა რიჩარდ სტალმანში, რომ მან თავის პრო-
ექტს დაარქვა GNU (Gnu's Not Unix). ეს რეკურსიული აკრონიმია და ხაზს უსვამს, რომ GNU
გთ
17
ლიცენზია ხაზგასმით გამორიცხავს დაპატენტების საშუალებას.
16
არ არის Unix. ამ პროექტის ფარგლებში მან შექმნა შემდგეგი პროდუქტები: GNU Compiler
Collection (GCC), GNU Debugger, ტექსტური რედაქტორი GNU Emacs, ლიცენზია GNU GPL.
პირველმა სწორედ სტალმანმა განავითარა Copyleft კონცეფცია.
თავისუფალი Unix!
მადლიერების19 ამ დღიდან ვაპირებ შევქმნა Unix-თან შეთავსებადი სრული სისტემა GNU
(Gnu's Not Unix). ის იქნება ღია და მისი გამოყენების უფლება ექნება ყველას. მივესალმები
:
ზე
დახმარებას ნებისმიერი ფორმით: დრო, ფული, პროგრამები, აღჭურვილობა ...
ა
– რიჩარდ სტალმანი; გამოქვეყნებული net.unix-wizards-ზე; 1983 წლის 27 სექტემბერი.
სტ
Free Unix!
ა!
ო
Starting this Thanksgiving I am going to write a complete Unix-compatible software
system called GNU (for Gnu's Not Unix), and give it away free to everyone who can
სი
ფ
use it. Contributions of time, money, programs and equipment are greatly needed...
ge
.
ელ
– Richard Stallman; Posting to net.unix-wizards; 27 Sept. 1983.
ვე
u.
1985 წელს იგი არამომგებიან ორგანიზაციას - თავისუფალი პროგრამების ფონდს
(FSF20 ) აფუძნებს. ფონდის მიზანია კომპიუტერული პროგრამების თავისუფლად გავრცელე-
ო
ed
თ
ბის, შექმნისა და თავისუფლად გარდაქმნის მხარდაჭერა. ამ ფონდში ის აგრძელებს უკვე არსე-
შა
ე
ბულ GNU პროექტებს, თუმცა სრულფასოვანი, Unix-ის მსგავსი, GNU ოპერაციული სისტემის
u.
ერ
შესაკვრელად (ჩამოსაყალიბებლად) მას აკლია ძირითადი კომპონენტი - ბირთვი. მართალია,
მუ
bt
1990 წლიდან GNU პროექტის ფარგლებში დაიწყეს ბირთვის შექმნა, სახელად Hurd, თუმცა
მწ
li@
მო
vi
sh
(Linus Torvalds) მიიღებს პერსონალურ კომპიუტერს 38621 -ის ბაზაზე, 40 მბ ტევადობის ხისტი
დისკითა და 4 მბ ზომის ოპერატიული მეხსიერებით. ის, როგორც ინფორმატიკის მიმართუ-
ნე
ra
ba
liz
თვის საკმაოდ ძვირი იყო) და გადაწყვეტს ჰობად გაიხადოს საკუთარი სისტემის წერა.
შე
”
19
ch
მადლიერების დღე (Thanksgiving Day) არის ეროვნული დღესასწაული აშშ-ში, კანადასა და სხვა ქვეყნებში. აშშ-
ში ის ნოემბრის მე-4 ხუთშაბათს აღინიშნება.
ხო
20
FSF - Free Software Foundation
ar
21
intel 80386 ცნობილი აგრეთვე, როგორც i386 ან უბრალოდ 386 არის 32 ბიტიანი მიკროპროცესორი. გამოვიდა
1985 წელს.
გთ
22
თავდაპირველად ლინუს ტორვალდს სურდა ბირთვისთვის დაერქმია Freax , როგორც სამი სიტყვის კომბინაცია:
”
Free (თავისუფალი), Freak (ახირება, უცნაური აჩემება) და X (როგორც Unix-ის ალუზია, მინიშნება). პროექ-
” ” ”
ტის ერთ-ერთ დასაკომპილირებელ ფაილსაც სწორედ Freax ერქვა. საწყის ეტაპზე ლინუსს განხილული ჰქონდა
”
Linux -ის ვარიანტი მაგრამ, მეტისმეტად ეგოისუტრად მიიჩნია და გადაიფიქრა. პროექტის საბოლოო ვერსია Linux
” ”
დასახელებით აიტვირთა ftp სერვერზე. საქმე ის იყო, რომ სერვერის ერთ-ერთმა ადმინისტრატორმა, არი ლემკემ (Ari
Lemmke), რომელიც ამავდროულად ლინუს ტორვალდრის თანამშრომელი იყო ჰელსინკის ტექნოლოგიურ უნივერსი-
ტეტში Helsinki University of Technology (HUT), ერთპიროვნულად ჩათვალა, რომ ბირთვისთვის Freax -ის დარქმება
”
17
გამარჯობა ყველას, ვინც აქ იყენებს minix-ს - მე ვქმნი (თავისუფალ) ოპერა-
ციულ სისტემას (მხოლო ჰობია. არ იქნება დიდი და ისეთი პროფესიონალური,
როგორიც GNU) 386(486) AT კლონებისთვის...
მაინტერესებს ხალხის აზრი, თუ რა შესაძლებლობების ხილვა სურთ ამ სისტე-
მაში. ნებისმიერ წინადადებას მივესალმები, მაგრამ არ გპირდებით, რომ ყველა
მათგანს გავითვალისწინებ :-)
:
ზე
– ლინუს ტორვალდსი; გამოქვეყნებული comp.os.minix-ზე; 1991 წლის 25 აგვისტო.
ა
Hello everybody out there using minix - I'm doing a (free) operating system (just a
სტ
hobby, won't be big and professional like gnu) for 386 (486) AT clones...
I'd like to know what features most people would want. Any suggestions are
ა!
ო
welcome, but I won't promise I'll implement them :-)
სი
ფ
– Linus Torvalds; Posting to comp.os.minix; 25 Aug. 1991.
ge
.
ელ
ბირთვის თავდაპირველი ვერსია 0.01 ლინუს ტორვალდსმა გამოუშვა 1991 წლის 17
ვე
სექტემბერს და მისი კოდი განათავსა FTP საიტზე (ftp.funet.fi). კოდი შეიცავდა 10 239 ხაზს.
u.
დეკემბრის თვეში გამოვიდა ახალი სტაბილური ვერსია 0.11 ლინუსის გამოგონილი ლიცენზი-
ო
ed
ით. ამავდროულად, ეს ბირთვი გამოიყენებოდა ისეთ პროგრამებთან ერთან სამუშაოდ, რომლე-
თ
ბიც GPL ლიცენზიით GNU პროექტის ნაწილი იყო. ტორვალდსმა, იცნობდა რა GNU პროექტის
შა
ე
ფარგლებში შესრულებული სამუშაოების მაღალ ხარისხს, გადაწყვიტა, თავის ნაშრომსაც GPL
u.
ერ
ლიცენზია მიენიჭებინა და GNU სისტემას მიეერთებინა. იგი იმედოვნებდა, რომ ამით მისი სის-
მუ
bt
ტემაც დიდ პოპულარობას მოიპოვებდა. 1992 წლის თებერვალში ტორვალდსმა GNU GPL ლი-
მწ
li@
- ლინუქსის GPL-ში განთავსება საუკეთესო რამ იყო, რაც ოდესმე გამიკეთებია . მას შემდეგ
”
მო
sh
ra
ba
ვერსიაა 5.7.4 (პირველი რიცხვი ბირთვის ვერსიას წარმოადგენს, მეორე და მესამე კი მთავარი
liz
თქვენ ამ წიგნს კითხულობთ, შესაძლებელია, ბოლო ვერსია უკვე სხვა იყოს. ბირთვის ვერსიე-
e
არქვეს TUX23 . სიტყვა Linux არის ლინუს ტორვალდსის მიერ დარეგისტრირებული სავაჭრო
”
ხო
არ იყო კარგი იდეა და ლინუსთან კონსულტაციის გარეშე პროექტს Linux დაარქვა. საბოლოოდ ლინუსი დათანხმდა.
”
TUX - (Torvalds’ UniX). თავდაპირველად Tux-ის რასტრული ვერსია 1996 წელს შექმნა ლარი
23
ევინგმა (Larry Ewing) ალან კოქსის (Alan Cox) რჩევით. შემდეგ კი დაიხვეწა თავად ლინუს
ტორვალდსის მიერ.
18
1.5.1 თანამშრომლობითი განვითარება
იშვიათია პროგრამისტი, რომელსაც შეუძლია კომპლექსური პროგრამის ყველა ნაწი-
ლის, ყველა ეტაპის ბოლომდე ოპტიმალურ დონეზე მიყვანა. როგორც წესი, ისინი კონკრე-
ტული დარგის სპეციალისტები არიან. თანამშრომლობითი განვითარებით კი, რომელიც თა-
ვისუფალი პროგრამების ლიცენზიების წყალობით გვაქვს, თითოეულ პროგრამისტს შეუძლია,
თავისი მაღალი კომპეტენციების ფარგლებში, პროგრამის ნაწილი განავითაროს. თავისუფალი
:
პროგრამული უზრუნველყოფის წარმატებაც სწორედ ამ პრინციპზეა დამყარებული. არსებობს
ზე
თავისუფალი პროგრამების ბევრი საზოგადოება, მაგალითად ლინუქსის საზოგადოება (Linux
community). ეს საზოგადოებები ინფორმაციას ცვლიან ინტერნეტში ფორუმებისა და დასაგზავ-
ა
ნი სიების (mailing lists) საშუალებით. შესაბამისად, სირთულეს არ წარმოადგენს, პრობლემის
სტ
შემთხვევაში, დახმარება მიიღოთ ამდენი საზოგადოებიდან. თანამშრომლობითი მიდგომა ხში-
რად მომხმარებლებზეც გადადის და შემდეგ ეს განწყობა მათშიც ვითარდება.
ა!
ო
რადგან Linux არის მხოლოდ და მხოლოდ ბირთვი, არასწორია ვთქვათ ოპერაციული
სი
ფ
სისტემა - Linux. ოპერაციული სისტემა არის GNU/Linux. GNU/Linux ვრცელდება დისტრიბუ-
ტივების (distro) ფორმით. დისტრიბუტივი შეიცავს თავად ოპერაციულ სისტემას და დამატები-
ge
.
თი პროგრამების დიდ კოლექციას, რაც მომხმარებელს ძალიან კომფორტულ სამუშაო გარემოს
ელ
უქმნის.
ვე
u.
არსებობს სრულიად თავისუფალი GNU/Linux დისტრიბუტევები. ისინი მხოლოდ თავი-
სუფალ პროგრამებს შეიცავენ. ასეთებია: Dragora, Dynebolic, Parabola, Hyperbola Trisquel,
ო
ed
თ
gNewSense და სხვა.
შა
u.
ერ
მუ
დისტრიბუტივი ვებ-გვერდი
bt
მწ
Debian www.debian.org
სა
li@
Ubuntu www.ubuntu.com
მო
CentOS www.centos.org
vi
ბი
Fedora
არ
getfedora.org
sh
Gentoo www.gentoo.org
შვ
ba
Manjaro manjaro.org
ნი
Elementary OS elementary.io
liz
Knoppix www.knopper.net
შე
Suse www.suse.com
e
il.
ვთ
ar
19
დაკავშირებული სხვადასხვა დოკუმენტაციის მოძიება და შეგროვება, ამ დოკუმენტაციის უმ-
რავლესობა ნათარგმნი არის მსოფლიოს ბევრ ენაზე.
ხანდახან დოკუმენტაციის ასეთი სიმრავლე თავსატეხსაც წარმოადგენს. ზოგჯერ რთუ-
ლია ასეთი დიდი რაოდენობის დოკუმენტაციიდან ზუსტად მორგებული დახმარების ამორჩევა.
Unix-ის ბრძანებების უმრავლესობას -h ან -help ან --help ოფცია გააჩნია. მათი დახმარებით
მომხმარებელს შეუძლია მოკლე დამხმარე ინფორმაციის ნახვა – თუ როგორ შეიძლება სინ-
ტაქსურად გამართული ფორმით ამ ბრძანების ჩაწერა. ხშირად მხოლოდ ბრძანების გაშვებაც
:
ზე
საკმარისია, რომ ინტერპრეტატორმა თვითონ მიგვითითოს არასრულად აკრეფილი ბრძანების
სწორი ჩაწერის შესაძლო ფორმებზე. თუ გვსურს უფრო დეტალური ინფორმაციის მიღება კონ-
ა
კრეტული ბრძანების შესახებ, შეგვიძლია man ბრძანება გამოვიყენოთ. man, იგივე man page
სტ
ან manual page (სახელმძღვანელო გვერდი) ძირითადად შედგება შემდეგი სექციებისგან:
ა!
ო
NAME - ბრძანების დასახელება, რომელსაც თან ახლავს ერთხაზიანი განმარტება
SYNOPSIS - ბრძანების ჩაწერის სწორი ფორმა
სი
ფ
DESCRIPTION - დეტალური აღწერა, თუ რას აკეთებს ეს ბრძანება
OPTIONS - ბრძანების ოფციები თავიანთი განმარტებით
ge
.
EXEMPLES - ბრძანების გამოყენების მაგალითები
ელ
SEE ALSO – ამ ბრძანების მსგავსი სხვა ბრძანებების სია
ვე
u.
Unix-ის ბრძანების ჩაწერის ზოგადი სტრუქტურა ასეთია:
ო
ed
თ
შა
u.
ერ
მუ
bt
მიუთითებს, რომ ოფციისა და არგუმენტის მითითება არასავალდებულოა. ანუ ასეთი ბრძანება
მწ
სა
li@
სინტაქსურად შეიძლება ჩავწეროთ ოფციისა და არგუმენტის გარეშე, ან მხოლოდ ოფციით, ან
მო
– command
vi
ბი
არ
– command option(s)
sh
– command argument(s)
ნე
ra
შვ
man ბრძანებას არგუმენტად უნდა მივუთითოთ ამ ბრძანების სახელი და ისე გავუშვათ. მაგალი-
ნი
20
თავი 2
:
ა ზე
ბრძანებათა ხაზი
სტ
ა!
ო
სი
ფ
რძანებები Unix-ში შეიძლება გაეშვას ბრძანებათა ხაზიდან სხვა ბრძანებებთან ერთად
ge
.
ელ
ყენოთ რამდენიმე სხვადასხვა სპეციალიზებული ინსტრუმენტების კომპლექტი კონკრე-
ვე
ტულ ამოცანაში, ვიდრე გამოვიყენოთ ერთი ისეთი აპლიკაცია, რომლებიც მრავალმხრი-
u.
ვი, კომპლექსური და უფრო ფართო დანიშნულების არის.
ო
ed
თ
შა
2.1 shell
ე
u.
ერ
მუ
bt
Line Interface). მისი საშუალებით ვეუბნებით კომპიუტერს თუ რისი გაკეთება გვსურს. ბრძა-
მწ
სა
ნებათა ხაზის ქვეშ, სინამდვილეში, ვგულისხმობთ shell-ს. Shell არის პროგრამა, რომელიც
li@
კლავიატურიდან იღებს ჩვენგან გადაცემულ ბრძანებებს და შესასრულებლად გადასცემს სის-
მო
ტემას. ლინუქსის თითქმის ყველა დისტრიბუტივი შეიცავს GNU პროექტის shell-ის ვარიანტს
ის
bash-ს. Unix-ის ორიგინალი shell (sh) 1979 წელს Steve Bourne-მა დაწერა Bell Labs-ში. Bash
vi
(Bourne Again SHell) კი მისი გაუმჯობესებული ვარიანტია, რომელიც ბრაიან ფოქსმა (Brian
ბი
არ
sh
Fox) შექმნა. მისი პირველი ვერსია 1989 წელს გამოვიდა და სწრაფადვე ფართოდ გავრცელდა.
bash, როგორც ძირითადი shell, გვხვდება არამხოლოდ ლინუქსის დისტრიბუტივებზე, არამედ
ნე
ra
ba
ნებთ გრაფიკულ გარემოს (GUI – Graphical User Infterface), მაშინ shell-ის გასაშვებად დაგ-
liz
რებიც.
il.
ნალია გაშვებული, რომელიც ტექსტურ სამუშაო გარემოს გვთავაზობს (TUI – Text-based User
ch
გადასვლა ხდება Alt + Ctrl + F1 , Alt + Ctrl + F2 , ... Alt + Ctrl + F7 კლავიშების
ar
1
თავდაპირველად ტერმინალს ეძახდნენ მოწყობილობას, რომლის მეშვეობითაც უკავშირდებოდნენ კომპიუტერს.
გთ
Unix-ის ადრეულ პერიოდში ტერმინალით მოიხსენიებდნენ საბეჭდი მანქანის მსგავსს მოწყობილობას teleprinter-
stype device-ს, იგივე teletypewriter-ს ან მოკლედ tty-ს. ეს იყო ელექტრო მექანიკური მოწყობილობა, რომლის სა-
შუალებითაც იგზავნება ტექსტური შეტყობინება. უფრო ტრადიციული გაგებით ტერმინალი არის მოწყობილობა, რომ-
ლითაც შეგვიძლია კომპიუტერთან ინტერაქცია კლავიატურისა და დისპლეის მეშვეობით. სადღეისოდ პროგრამები
უზრუნველყოფენ ერთი ფიზიკური ტერმინალის ნაცვლად პროგრამულად რამდენიმე ვირტუალური ტერმინალის არსე-
ბობის შესაძლებლობას. მათ აღსანიშნავად ხშირად შეგვხვდება სხვადასხვა ტერმინები: ტერმინალი , ვირტუალური
” ”
ტერმინალი , კონსოლი , ვირტუალური კონსოლი .
” ”
21
კომბინაციით (აქედან ერთ-ერთი გრაფიკულ გარემოში დაგვაბრუნებს, ზოგ დისტირბუტივზე
ეს Alt + Ctrl + F1 -ია, ზოგზე კი Alt + Ctrl + F7 ). ტერმინალის ემულატორებისგან
განსხვავებით, კონსოლი სრულ ეკრანზეა გაშლილი.
ყურადღება!
:
ზე
console ზოგადი ტერმინია. მას ხშირად პირველ ტერმინალად მოიხსენიებენ, რომელზეც
სისტემის შეტყობინებები გამოდის, ხოლო konsole ვირტუალური ტერმინალის ერთ-
ა
ერთი პროგრამული უზრუნველყოფის დასახელებაა.
სტ
ა!
დავიწყოთ. ამ წიგნში ნაჩვენები ყველა მაგალითი Debian 9 (stretch)/Debian 10
ო
(buster) დისტრიბუტივების ბაზაზეა განხორციელებული, თუმცა ლინუქსის ნებისმიერი დის-
სი
ფ
ტრიბუტივისთვისაც იქნება სამართლიანი.
მოდით, გავხსნათ ერთ-ერთი ტერმინალის ემულატორი, მაგალითად gnome-terminal,
ge
.
რომელშიც ნაგულისხმევი მნიშვნელობით (by default) გაშვებული არის bash. გახსნილ ფანჯა-
ელ
ვე
რაში ასეთი ან მსგავსი ჩანაწერი დაგვხვდება, რომლის ბოლოშიც კურსორი იციმციმებს.
u.
ო
ed
achiko@debian:∼$
თ
შა
u.
ეს არის shell-ის მოსაწვევი (shell invitation, prompt) და მისი გამოჩენა ნიშნავს, რომ
ერ
მუ
shell მომხმარებლის მიერ ბრძანების შეტანას ელოდება. ვცადოთ და ავკრიფოთ რამე. შეყვა-
bt
ნის ღილაკით – შესასრულებლად გავუშვათ ჩვენ მიერ ახლახანს შეტანილი ბრძანება .
”
მწ
li@
ბრძანებას, shell მას ვერ გაიგებს და ასეთ პასუხს დაგვიბრუნებს:
მო
ის
vi
achiko@debian:∼$ asdfasd
ბი
sh
achiko@debian:∼$
ნე
ra
ეს
ყურადღება!
e
il.
ვთ
აკოპირებს ბუფერში და მისი ჩასმა მარტივად შეგიძლიათ მაუსის შუა ღილაკზე დაჭერით.
ხო
ar
22
სია. ვცადოთ:
achiko@debian:∼$ ls
Desktop/ Downloads/ Pictures/ Templates/
Documents/ Music/ Public/ Videos/
:
ზე
მშვენიერი!
მოდით, გავიგოთ რომელ დირექტორიაში ვიმყოფებით ახლა. ამაში ბრძანება pwd (Print
ა
Working Directory) დაგვეხმარება.
სტ
achiko@debian:∼$ pwd
ა!
ო
/home/achiko
სი
ფ
როგორც ჩანს, /home/achiko-ში ვიმყოფებით სამუშაოდ. ზოგადად, როდესაც მომხმა-
ge
.
რებელი სისტემაში შედის ტერმინალით, ის ავტომატურად საკუთარ დირექტორიაში აღმოჩნდე-
ელ
ვე
ბა ხოლმე. ეს ის გარემოა, სადაც მომხმარებელი ინახავს საკუთარ ფაილებს, დირექტორიებს,
u.
პროგრამებს და სხვა.
Unix-ის მსგავს სისტემებში ფაილები განაწილებულია იერარქიულ, ხისებრ სტრუქტუ-
ო
ed
თ
რაში. პირველ დირექტორიას ძირი დირექტორია ჰქვია (root directory) და აღინიშნება / -ით,
შა
u.
ერ
ვენ ქვედირექტორიებსა და ფაილებს. დირექტორიების სტრუქტურა გრაფიკულად ასე შეიძლება
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
23
მივუთითოთ, სადაც გვსურს გადასვლა. Path, ფაქტობრივად, არის ხისებრ სტრუქტურაში გზა
ფაილისკენ3 . Path შეიძლება ჩაიწეროს ორი ფორმით - როგორც აბსოლუტური გზა (absolute
path) ან როგორც ფარდობით გზა (relative path).
აბსოლუტური გზა ძირი დირექტორიიდან იწყება /-ით. მაგალითად, /usr/bin აბსოლუ-
ტური გზაა და აღნიშნავს bin დირექტორიას, რომელიც განთავსებულია დირექტორია usr-ში,
ხოლო usr კი თავის მხრივ განთავსებულია /-ში. პირველი /, როგორც აღვნიშნეთ, ძირი დი-
რექტორიის სახელია, ხოლო დანარჩენი /-ები უბრალოდ დირექტორიებს შორის გამყოფ სიმბო-
:
ზე
ლოდ მოიაზრება. ამას გარდა, დირექტორიის დასახელებას, იმის ხაზგასასმელად, რომ საქმე
დირექტორიას ეხება და არა სხვა ტიპის ფაილს, ხშირად /-ს უმატებენ ხოლმე ბოლოში (რო-
ა
გორც დირექტორიებს შორის გამყოფს).
სტ
ა!
achiko@debian:∼$ cd /usr/bin
ო
achiko@debian:/usr/bin$ pwd
სი
ფ
/usr/bin
achiko@debian:/usr/bin$ ls
ge
.
[
ელ
2to3
ვე
u.
2to3-2.7
2to3-3.5
ო
ed
თ
411toppm
შა
7z
ე
u.
7za
ერ
მუ
7zr
bt
aconnect
მწ
სა
add-apt-repository
li@
addpart
მო
addr2line
ის
alsabat
vi
alsaloop
ბი
არ
sh
...
ნე
ra
ეს
achiko@debian:∼$ cd /usr/bin
il.
ვთ
achiko@debian:/usr/bin$ pwd
/usr/bin
ch
ხო
ar
3
ლინუქსში ყველაფერი ფაილია. დირექტორიაც ფაილია, მხოლოდ დირექტორიის ტიპის. არსებობს ფაილის სხვა
ტიპებიც. ტრადიციული გაგების ფაილს ლინუქსში ჩვეულებრივი ტიპის ფაილს უწოდებენ. თუმცა ხშირად, უბრალოდ
ფაილს ვამბობთ ხოლმე.
24
achiko@debian:∼$ cd /usr
achiko@debian:/usr$ pwd
/usr
:
ზე
achiko@debian:/usr/bin$ cd ..
achiko@debian:/usr$ pwd
ა
/usr
სტ
ა!
ორივე ხერხის გამოყენებით ერთსა და იმავე შედეგს მივიღებთ - მიმდინარე დირექტო-
ო
რიიდან მამა დირექტორიაში გადავალთ. მამა დირექტორიიდან უკან დაბრუნებაც (/usr/bin-
სი
ფ
ში) ამ ორი ხერხით შეგვიძლია.
აბსოლუტური გზით:
ge
.
ელ
achiko@debian:/usr$ cd /usr/bin ვე
u.
achiko@debian:/usr/bin$ pwd
ო
ed
/usr/bin
თ
შა
u.
ფარდობითი გზით:
ერ
მუ
bt
მწ
achiko@debian:/usr$ cd ./bin
სა
li@
achiko@debian:/usr/bin$ pwd
მო
/usr/bin
ის
vi
”
sh
ra
ეს
achiko@debian:/usr$ cd bin
შვ
ba
ნი
cd ∼ ნავს).
ch
ar
გთ
დავუბრუნდეთ ls ბრძანებას და უფრო მეტი გავიგოთ მის შესახებ. გაშვებისას მას შეგ-
ვიძლია ერთდროულად რამდენიმე ოფცია ან/და არგუმენტი გადავცეთ. ოფციებისა და არგუმენ-
ტების გარეშე, მხოლოდ ls, როგორც ზემოთ დავრწმუნდით მხოლოდ მიმდინარე დირექტორის
ფაილებისა და ქვედირექტორიების სიას გვანახებს. მოდით, გადავცეთ არგუმენტი, მაგალითად
ფაილი GPL3.txt. ის ბრძანებისგან გამოტოვების სიმბოლოთი (space) უნდა იყოს დაშორებუ-
ლი. ბრძანებათა ხაზში ჩაწერილი lsGPL3.txt (გამოტოვების გარეშე) დამოუკიდებელ ბრძა-
25
ნებად აღიქმება და რადგან ასეთი ბრძანება არ არსებობს, ეკრანზე შეცდომის შეტყობინება
გამოვა. ამიტომაა აუცილებელი გამოტოვების გამოყენება.
achiko@debian:∼$ ls GPL3.txt
GPL3.txt
:
ზე
achiko@debian:∼$ lsGPL3.txt
-bash: lsGPL3.txt: command not found
ა
სტ
ls ბრძანების არგუმენტი შეიძლება იყოს ფაილი ან დირექტორია. თუ ფაილი მივუთი-
ა!
თეთ, ამით ვამოწმებთ არსებობს თუ არა მიმდინარე დირექტორიაში ამ დასახელების მქონე
ო
ფაილი. თუ დირექტორიაა არგუმენტად მითითებული, ამით შევამოწმებთ არსებობს თუ არა ამ
სი
ფ
დასახელების მქონე დირექტორია, და მისი არსებობის შემთხვევაში, ls მის შიგთავსს გამოი-
ტანს ეკრანზე.
ge
.
ამ მაგალითში ls ბრძანებას ერთი არგუმენტი - GPL3.txt გადავეცით. მას შეიძლება
ელ
ვე
გადავცეთ აგრეთვე გამოტოვების სიმბოლოთი დაშორებული რამდენიმე არგუმენტი ერთად,
u.
ფაილები ან/და დირექტორიები.
ო
ed
თ
შა
u.
GPL3.txt
ერ
მუ
bt
Downloads/:
მწ
Tux.jpg
სა
li@
მო
vi
სას. ეს ოფციები ბრძანებების ქცევას ცვლიან. ბრძანების ჩაწერის ზოგადი ფორმა ასეთია:
ბი
არ
sh
ra
ეს
შვ
ოფცია ერთ ასო-ნიშანს წარმოადგენს. მას მოკლე ოფციას ეძახიან. არსებობს ოფციის ჩაწერის
ნი
გრძელი ფორმაც, რომელიც -- -თი (ორი ტირე) მოიცემა. მაგალითად ls --all. გრძელი ოფცია
”
liz
ინგლისური სიტყვით მოიცემა. ისინი ხშირად გვხვდება GNU პროექტის ფარგლებში შექმნილ
შე
ნაკლები სიმბოლოს აკრეფა გვიწევს და 2) რამდენიმე ოფციის მითითებისას მათი ტირეთი გა-
il.
ოფციის ჩაწერის უპირატესობა ისაა, რომ ის უფრო ინტუიტიურია. ოფციის ეს ფორმა, როგორც
ch
26
ცნობილი ფორმატია ASCII (American Standard Code for Information Interchange) ტექსტი.
ეს არის მარტივი კოდირების სქემა, რომელიც პირველად გამოიყენეს Teletype machine-ებზე,
რათა კლავიატურის სიმბოლოები გადაეყვანათ რიცხვებში. ამ ფორმატის ტექსტი წარმოადგენს
ასო-ნიშნების ერთი ერთში გადაყვანას რიცხვებში. შესაბამისად, ის ძალიან კომპაქტურია. 50
ასო-ნიშანი მონაცემთა 50 ბაიტის ექვივალენტურია. მნიშვნელოვანია იმის გაგება, რომ ტექ-
სტური ფორმატი მხოლოდ ასო-ნიშნების ციფრებში შესაბამისობას შეიცავს. ბევრ ტექსტურ რე-
დაქტორში, მაგალითად LibreOffice, OpenOffice ან Microsoft Word, შექმნილი ფაილი, ASCII
:
ზე
ტექსტისგან განსხვავებით, ბევრ სხვა ელემენტს შეიცავს, რომლებიც მის ფორმატსა და სტრუქ-
ტურას განსაზღვრავენ. სუფთა ASCII ტექსტი შეიცავს მხოლოდ ასო-ნიშნებს და კონტროლის
ა
კოდების ძალიან მცირე რაოდენობას, როგორიცაა ტაბულაცია (რამდენიმე გამოტოვება ერ-
სტ
თად), ახალი ხაზზე გადასვლა (new line, \n), იმავე ხაზის დასაწყისზე გადასვლა (carriage
return, \r) და ა.შ.
ა!
ო
სისტემეში ძალიან დიდი დატვირთვა აქვს ტექსტურ ფაილს. ბევრი მნიშვნელოვანი ინ-
სი
ფორმაცია შენახული არის ტექსტური ფორმატით. შესაბამისად, ლინუქსში მათ დასამუშავებ-
ფ
ლად ბევრი ბრძანება არსებობს.
ge
.
ბრძანება file გვეუბნება ფაილის ტიპსა და ფორმატს.
ელ
ვე
u.
achiko@debian:∼$ file Downloads/Tux.jpg
Tux.jpg: JPEG image data, JFIF standard 1.01, resolu
ო
ed
თ
tion (DPI), density 72x72, segment length 16,
შა
u.
ერ
მუ
bt
როგორც ჩანს, Tux.jpg ფაილი JPEG ფორმატის სურათია. ფაილს Tux.jpg-ის ნაცვლად
მწ
რომ მხოლოდ Tux ერქვას, file Tux ბრძანება მაინც იგივე პასუხს დაგვიბრუნებდა, რადგან
სა
li@
ლინუქსში მნიშვნელოვანია არა ფაილის გაფართოება, არამედ მისი შიგთავსი. გაფართოება
მო
vi
ბი
sh
ra
ეს
liz
...
e
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
დიდი შიგთავსის მქონე ფაილის ნახვა თუ გვსურს, უმჯობესია less ბრძანება გამოვი-
ყენოთ, რადგან cat მხოლოდ იმ პორციას გვაჩვენებს, რაც ეკრანის ბოლოს დაეტევა. less-
ის შემთხვევაში კი კლავიატურაზე მიმართულების ისრებით შეგვიძლია ზევით/ქვევით გვერდ-
27
გვერდ/ხაზ-ხაზ გადაადგილება და ფაილის შიგთავსის ამგვარად დათვალიერება. ამ პროგრამი-
დან გამოსასვლელად q კლავიშს უნდა დავაჭიროთ.
”
:
Version 3, 29 June 2007
ზე
Copyright (C) 2007 Free Software Foundation, Inc.
ა
<http://fsf.org/>. Everyone is permitted to copy and
სტ
istribute verbatim copies of this license document,
but changing it is not allowed.
ა!
ო
სი
ფ
Preamble
ge
.
The GNU General Public License is a free, copyleft
ელ
license for software and other kinds of works.
ვე
u.
The licenses for most software and other practical
ო
ed
თ
works are designed ...
შა
u.
ერ
less ბრძანება more ბრძანების გაუმჯობესებული ვარიანტია. more-ის შემთხვევაში ფა-
მუ
bt
უკან ასვლა კი - აღარ.
მწ
სა
li@
Linux-ში, განსაკუთრებით კი ტექსტურ გარემოში, ფაილის გაფართოვებას დიდი დატ-
მო
vi
თუ ის ფაილი.
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
28
თავი 3
:
ა ზე
სისტემის სტრუქტურა
სტ
ა!
ო
სი
ფ
ხლა, როცა უკვე ვიცით სისტემაში მოძრაობა, დირექტორიიდან დირექტორიაში გადას-
ა ვლა, მოდით, უკეთ გავიცნოთ, თუ რისგან შედგება Linux სისტემა. როგორც ზემოთ აღ-
ge
.
ელ
ვნიშნეთ, ლინუქსში ყველა დირექტორია თუ ფაილი ძირეულ დირექტორიაში, /-ში არის
ვე
განთავსებული. დირექტორიების განაწილების სტრუქტურა და შიგთავსი ლინუქსსა და
u.
Unix-ის მსგავს სისტემებში ძალიან ჰგავს ერთმანეთს და ის ფაილების სისტემის იერარქიულ
ო
სტნადარტს - (FHS)-ს (Filesystem Hierarchy Standard) მიესადაგება. ეს სტანდარტი შეიმუშა-
ed
თ
ვეს Linux Foundation1 -ში. სადღეისოდ FHS-ის მე-3 ვერსია არსებობს, რომელიც გვკარნახობს
შა
ე
თუ რა დირექტორიები უნდა იყოს განთავსებული /-ში და მათში რა უნდა ინახებოდეს. აღსა-
u.
ერ
ნიშნავია ის ფაქტი, რომ ამ სტანდარტს მხოლოდ სარეკომენდაციო ხასიათი აქვს. ლინუქსის
მუ
bt
დისტრიბუტივების უმრავლესობა ერთმანეთში თავსებადობის შესანარჩუნებლად იზიარებს ამ
მწ
li@
კონკრეტული სისტემისთვის დამახასიათებელი გადანაცვლებები.
მო
vi
achiko@debian:∼$ ls /
ბი
არ
sh
ra
შვ
ba
კოდშია ჩაწერილი.
გთ
1
Linux Foundation - არამომგებიანი ორგანიზაცია, რომლის მიზანია ლინუქსისა და თანამშრომლობითი განვითა-
რების მხარდაჭერა.
29
achiko@debian:∼$ ls /bin
...
bzdiff loadkeys sed
bzegrep login setfacl
bzexe loginctl setfont
:
bzfgrep lowntfs-3g setupcon
ზე
bzgrep ls sh
bzip2 lsblk sh.distrib
ა
bzip2recover lsmod sleep
სტ
bzless mkdir ...
ა!
ო
სი
ფ
/boot Boot ინგლისური სიტყვაა და ქართულად ჩატვირთვას ნიშნავს. Boot დირექ-
ტორიაში ლინუქსის ბირთვი და სისტემის ჩატვირთვისთვის სხვა აუცილებელი
ge
.
ელ
ფაილებია განთავსებული.
ვე
u.
მაგალითად: vmlinuz-4.9.0-9-amd64 ფაილი /boot-ში ინახება. ლინუქსში
ო
ბირთვს vmlinuz ჰქვია.
ed
თ
შა
u.
ერ
achiko@debian:∼$ ls /boot
მუ
config-4.9.0-3-amd64 System.map-4.9.0-3-amd64
bt
config-4.9.0-9-amd64 System.map-4.9.0-9-amd64
მწ
სა
grub vmlinuz-4.9.0-3-amd64
li@
initrd.img-4.9.0-3-amd64 vmlinuz-4.9.0-9-amd64
მო
initrd.img-4.9.0-9-amd64
ის
vi
ბი
არ
sh
ra
ba
ტერმინალი.
ხო
ar
achiko@debian:∼$ ls /dev
გთ
...
block log shm tty25 tty49 urandom
bsg loop-control snapshot tty26 tty5 vcs
btrfs-control mapper snd tty27 tty50 vcs1
bus mcelog sr0 tty28 tty51 vcs2
30
...
:
”
ზე
მაგალითად: /etc/passwd – სისტემაში არსებული მომხმარებლების პარა-
ა
მეტრების ფაილი აქ არის შენახული.
სტ
achiko@debian:∼$ ls /etc
ა!
ო
...
სი
ფ
crontab parallel
cron.weekly passwd
ge
.
cupshelpers passwd-
ელ
dbus-1 perl
ვე
u.
debconf.conf pm
debian_version polkit-1
ო
ed
თ
...
შა
u.
ერ
მუ
bt
/home მოიცავს მომხმარებლების პირად დირექტორიებს, რომლებშიც ისინი ინახავენ
მწ
li@
მომხმარებლის სახელს ემთხვევა. მასში მომხმარებელი ავტომატურად აღმოჩ-
მო
vi
sh
achiko@debian:∼$ ls /home
ნე
ra
achiko
ეს
შვ
ba
ნი
ფაილები).
31
achiko@debian:∼$ ls /lib
...
libbz2.so.1.0 libnss_nis-2.24.so
libbz2.so.1.0.4 libnss_nisplus-2.24.so
libc-2.24.so libnss_nisplus.so.2
libcap-ng.so.0 libnss_nis.so.2
:
libcap-ng.so.0.0.0 libntfs-3g.so.871
ზე
...
ა
სტ
/media ლინუქსის ახალ სისტემებში ამ დირექტორიაში მოხსნადი მოწყობილობების
ა!
ო
(removable media) მონტაჟის წერტილებია2 (mount point) განთავსებული. მაგა-
ლითად, როგორიცაა CDROM, USB ფლეშ მეხსიერება და ა.შ. როგორც წესი, მათი
სი
ფ
მონტაჟი /media დირექტორიაში ავტომატურად ხდება კომპიუტერთან მიერთების
ge
შემდეგ.
.
ელ
ვე
მაგალითად: /media/cdrom – CD-ROM-ის მონტაჟის წერტილია.
u.
ო
ed
თ
achiko@debian:∼$ ls /media
შა
cdrom cdrom0
ე
u.
ერ
მუ
bt
მწ
სა
vi
ბი
არ
sh
წარმოადგენს.
შვ
ba
ნი
”
რეობის შესახებ.
il.
ვთ
პროცესორის შესახებ.
2
მონტაჟის წერტილი იმ დირექტორიას წარმოადგენს, რომელიც მოწყობილობის, მაგალითად დისკის, ფაილს შეე-
საბამება. კომპიუტერში არსებულ დისკებზე წვდომა მომხმარებელს მხოლოდ ამ დირექტორიების მეშვეობით შეუძლია.
მაგალითად: USB ფლეშ მეხსიერებაზე ფაილების კოპირება თუ გსურთ, ეს ფაილები მისი მონტაჟის წერტილში - შესა-
ბამის დირექტორიაში უნდა აკოპიროთ
32
achiko@debian:∼$ ls /proc
1 16 295 432 53565 8 iomem schedstat
10 164 3 434 53567 9 ioports self
103 168 30 436 53568 944 irq slabinfo
105 169 31 43765 53573 96 kallsyms softirqs
:
106 171 32 443 53574 99 kcore stat
ზე
107 172 33 45 53575 acpi keys swaps
...
ა
სტ
ა!
ო
/root ეს დირექტორია მთავარი ადმინისტრატორის - root მომხმარებლის - პირად დი-
რექტორიას წარმოადგენს.
სი
ფ
რ
ge
.
ელ
/sbin
ვე
/bin-ის მსგავსად ეს დირექტორიაც შეიცავს ძირითად ბრძანებებს. უმრავლეს შემ-
u.
თხვევაში მათ გასაშვებად სპეციალური უფლებების ქონაა საჭირო. ამ პროგრამებს
ძირითადად სისტემის ადმინისტრატორები იყენებენ ხოლმე.
ო
ed
თ
შა
u.
achiko@debian:∼$ ls /sbin
ერ
მუ
bt
agetty getty mount.vmhgfs
მწ
li@
badblocks hdparm ntfsclone
მო
sh
...
ნე
ra
ეს
შვ
e
il.
ვთ
33
/usr/bin - ყველა მომხმარებლისთვის განკუთვნილი დამატებითი ბინარული
ფაილები.
/usr/sbin - ადმინისტრატორისთვის განკუთვნილი დამატებითი ბრძანებები.
/usr/lib - სხვადასხვა პროგრამისთვის (ძირითადად /usr/bin და
:
/usr/sbin-ში განთავსებული) საჭირო გაზიარებული ბიბლიოთეკები.
ზე
/usr/local - მხოლოდ მოცემული კომპიუტერში არსებული დამატებითი
ა
იერარქიული სტრუქტურა, რომელიც, თავის მხრივ, შეიძლება შეიცავდეს
სტ
bin-ს, lib-ს, sbin-ს და ა.შ.
ა!
ო
achiko@debian:∼$ ls /usr
სი
ფ
bin games include lib local sbin share src
achiko@debian:∼$ ls /usr/bin
ge
[ bc c++filt
.
ელ
aconnect bccmd chacl
ვე
u.
add-apt-repository bdftopcf chage
...
ო
ed
თ
შა
u.
ერ
/var შეიცავს ისეთ ფაილებს, რომელთა შიგთავსიც ცვალებადია: ბუფერული ფაილები
მუ
bt
(spool files), ელ.ფოსტის ფაილები, ჟურნალის ფაილები (log files) და ა.შ.
მწ
სა
li@
მაგალითად: /var/log/auth.log ფაილი შეიცავს აუთენტიკაციის შესახებ
მო
ტერმინალიდან და ა.შ.
vi
ბი
არ
sh
achiko@debian:∼$ ls /var
backups cache lib local lock log mail opt run spool tmp
ნე
ra
ეს
შვ
ba
ნი
ში, მცირე სახეცვლილებებით. კვლავ ხაზი გავუსვათ, რომ FHS-ს მხოლოდ რეკომენდაციის
შე
ხასიათი აქვს.
e
il.
ვთ
ch
ხო
ar
გთ
34
თავი 4
:
ა ზე
მოქმედებები ფაილებზე
სტ
ა!
ო
სი
ფ
მ თავში განვიხილავთ ფაილებისა და დირექტორიების კოპირების, გადატანის, წაშლის
ge
.
ელ
რემოში ადვილად არის შესაძლებელი. მაუსით მათი მონიშვნა და სხვა დირექტორიაში
ვე
გადატანა ან წაშლა დიდ სირთულესთან არ არის დაკავშირებული. მაშ, რატომ ვირთუ-
u.
ლებთ საქმეს shell-ში ამ ბრძანებების სწავლით? პასუხი მარტივია: shell-ში ჩაწერილ ბრძანე-
ო
ბებს ძალიან ფართო შესაძლებლობები აქვთ. წარმოვიდგინოთ, რომ გვსურს ბევრი jpg ფაილის
ed
თ
კოპირება dir1 დირექტორიიდან dir2-ში, მაგრამ მხოლოდ მათი, რომლებიც მეორე დირექტო-
შა
ე
რიაში არ არსებობენ ან ისეთების, რომელთა შიგთავსიც უფრო ახალია. ასეთი ამოცანის შესრუ-
u.
ერ
ლება გრაფიკულ გარემოში საკმაოდ დიდ დროს მოითხოვს, ბრძანებათა ხაზიდან კი წამიერად
მუ
bt
კეთდება მხოლოდ ერთი ბრძანებით. ასე:
მწ
სა
li@
achiko@debian:∼$ cp -u dir1/*.jpg dir2/
მო
ის
vi
sh
shell-ის ბრძანებებს ასე მძლავრს. shell-ში ხშირად გვიწევს დიდი რაოდენობით ფაილებთან
ra
ეს
liz
ar
გთ
1
ტერმინი wild card თავდაპირველად გამოიყენებოდა კარტის თამაშის დროს და ასეთი კარტი წარმოადგენდა ე.წ.
ჯოკერს, რომელსაც ყველა კარტის მაგივრობის გაწევა შეეძლო. სწორედ აქედან მოდის ეს ტერმინი.
35
[] კვადრატული ფრჩხილები აღნიშნავს ნებისმიერ ასო-ნიშნანს იმ ასო-ნიშანთა
რიგიდან, რომელიც მასშია ჩაწერილი. ასო-ნიშნების რიგი შეიძლება - -თი
”
(ტირე) ჩაიწეროს ან მოიცეს კლასით და ის ინტერვალის აღმნიშვნელი იქნება.
ხშირად გამოყენებადი კლასებია: [:lower:] – ლათინური ანბანის პატარა ასო-
ნიშნები, [:upper:] – ლათინური ანბანის დიდი ასო-ნიშნები, [:digit:] – ციფრე-
ბი, [:alpha:] – ლათინური ანბანის ასო-ნიშნები, [:alnum:] – ლათინური ანბანის
:
ზე
სიმბოლოები და ციფრები.
ა
ასო-ნიშანთა რიგს, რომლებიც კვადრატულ ფრჩხილებში არ არის მოცემული.
სტ
{} ფიგურული ფრჩხილები აღნიშნავს მასში ჩაწერილი, მძიმით გამოყოფილი გა-
ა!
ო
მოსახულებების ალტერნატივას. გამოსახულებაში შესაძლებელია რამდენიმე
ასო-ნიშანიც იყოს. ასეთი ფრჩხილებში შესაძლებელია აგრეთვე ორი წერტი-
სი
ფ
ლის (..) გამოყენება. ამით, ასო-ნიშნების ინტერვალის მოცემა შეიძლება.
ge
.
ელ
იხილეთ მაგანერირებელი სიმბოლოების გამოყენების რამდენიმე მაგალითი:
ვე
u.
ნიმუში აღნიშნავს მიმდინარე დირექტორიაში:
ო
ed
თ
შა
* ყველა ფაილს.
ე
u.
ერ
f*.jpg ყველა ფაილს, რომლების f-ით იწყება და მთავრდება .jpg-ით.
მუ
bt
Documents/* Documents დირექტორიის ყველა ფაილს.
მწ
სა
li@
*abc* ყველა ფაილს, რომელის დასახელებაშიც abc შედის. აქ თვითონ abc
მო
ლისხმობს.
vi
sh
ra
[^abc]* ყველა ფაილს, რომლებიც იწყება არა a-თი ან არა b-თი ან არა c-თი.
ეს
შვ
[a-cst]* ყველა ფაილს, რომლებიც იწყება ან a-დან c-ს ჩათვლით ერთ-ერთი ასო-
ba
liz
{1..15}
il.
{b..f} b, c, d, e, f.
ar
{f..b} f, e, d, c, b.
გთ
{m..a..3} m, j, g, d, a.
36
*.{[jJ][pP][gG] ყველა ფაილს, რომლის გაფართოებაც არის jpg ან bmp, დიდი ან პა-
,[bB][mM][pP]} ტარა ან შერეული ასოებით მოცემული.
:
ნებას გადავცეთ, რომელსაც არგუმენტად ფაილები გადაეცემა. მთავარი განსხვავება კვადრა-
ზე
ტულსა და ფიგურულ ფრჩხილებს შორის უკვე ვიცით - კვარდატულ ფრჩხილებში მოცემული
გამოსახულებიდან სათითაო ასო-ნიშნები იგულისხმება, ფიგურულში კი მძიმით გამოყოფილი
ა
ასო-ნიშანთა ერთობლიობა, ანუ გამოსახულება. გარდა ამისა, კვადრატული ფრჩხილების გა-
სტ
მოყენებით ხდება არსებული ფაილებიდან ამორჩევა და გამოტანა. შესაბამისად, ფაილების შე-
საქმნელად ეს მიდგომა არ გამოდგება. ფიგურული ფრჩხილების გამოყენებით კი ფაილების
ა!
ო
შექმნაც შესაძლებელია.
სი
ფ
რ
ge
.
4.2 ფაილების შექმნა
ელ
ვე
u.
გავაგრძელოთ shell-ის ბრძანებების შესწავლა და ვნახოთ, როგორ შეიძლება შევქმნათ
ფაილი. ბრძანება touch ქმნის ცარიელ ფაილებს. მისი სინტაქსი მარტივია. მას არგუმენტად
ო
ed
თ
უნდა გადავცეთ ფაილ(ებ)ის სახელები.
შა
u.
ერ
achiko@debian:∼$ touch file
მუ
bt
მწ
li@
- file1, file2 და file3.
მო
ის
vi
sh
დავრწმუნდეთ:
ნე
ra
ეს
შვ
achiko@debian:∼$ ls
ba
ar
achiko@debian:∼$ ls file[123]
file1 file2 file3
გთ
achiko@debian:∼$ ls file{1,2,3}
file1 file2 file3
37
achiko@debian:∼$ ls file[1234]
file1 file2 file3
achiko@debian:∼$ ls file{1,2,3,4}
ls: cannot access 'file4': No such file or directory
file1 file2 file3
:
ზე
მეორე შემთხვევაში შეცდომის შეტყობინებაც გამოვიდა ეკრანზე, რომელიც გვამ-
ცნობს, რომ file4 დასახელების ფაილი არ გვაქვს. პირველ შემთხვევაში კი არა. ეს იმიტომ
ა
მოხდა, რომ ფიგურული ფრჩხილებში ჩაწერილი მონაცემებიდან ყველა მათგანი განიხილება.
სტ
ანუ ჩვენი ჩაწერილი ბრძანება ls file{1,2,3,4} შემდეგი ბრძანების ექვივალენტია - ls file1
file2 file3 file4. კვადრატული ფრჩხილების დროს კი ერთ-ერთი მათგანის არსებობაც კმა-
ა!
რა, რომ შეცდომა არ გამოვიდეს. კვადრატული ფრჩხილების შემთხვევაში შეცდომა მხოლოდ
ო
მაშინ გამოვიდოდა, თუ არცერთი ფაილი არ იარსებებდა.
სი
ფ
ფაილებისგან განსხვავებით დირექტორიები mkdir ბრძანებით იქმნება. ასე:
ge
.
ელ
achiko@debian:∼$ mkdir directory
ვე
u.
ო
ed
თ
ერთდროულად რამდენიმე დირექტორიის შექმნა კი ასე ხდება:
შა
u.
ერ
achiko@debian:∼$ mkdir dir1 dir2 dir3
მუ
bt
მწ
უკვე შექმნილ დირექტორიაში ფაილის შექმნა ისე, რომ მასში არ გადავიდეთ, ასე ხდე-
სა
li@
ბა:
მო
ის
vi
sh
achiko@debian:∼$ ls
ვთ
file[0-9].txt
ch
achiko@debian:∼$ ls file*
ar
achiko@debian:∼$ ls file[0-9]*
file0.txt file2.txt file4.txt file6.txt file8.txt
file1.txt file3.txt file5.txt file7.txt file9.txt
38
წერტილით მიმდევრობა არ გვაქვს ჩაწერილი და მხოლოდ ამით არ ვკმაყოფილდებით), რად-
გან ის ალტერნატივების მოცემის ფორმაა. მძიმის გარეშე ეს ფრჩხილები ჩვეულებრივ სიმბო-
ლოდ აღიქმება შელის მიერ. მოდით, კვლავ მაგალითს მივმართოთ და სასურველ ფაილებს
გაფართოება როგორც პატარა, ასევე დიდი ასოებით შევუქმნათ.
:
achiko@debian:∼$ ls file*
ზე
file[0-9].txt file2.txt file4.TXT file7.txt file9.TXT
file0.txt file2.TXT file5.txt file7.TXT
ა
სტ
file0.TXT file3.txt file5.TXT file8.txt
file1.txt file3.TXT file6.txt file8.TXT
ა!
file1.TXT file4.txt file6.TXT file9.txt
ო
achiko@debian:∼$ touch file2.{txt}
სი
ფ
achiko@debian:∼$ ls file*
file[0-9].txt file2.txt file4.TXT file7.txt file9.TXT
ge
.
file0.txt file2.TXT file5.txt file7.TXT file2.{txt}
ელ
file0.TXT file3.txt file5.TXT file8.txt
ვე
u.
file1.txt file3.TXT file6.txt file8.TXT
file1.TXT file4.txt file6.TXT file9.txt
ო
ed
თ
შა
ე
ოდნავ გავართულოთ ჩვენი ამოცანა და შევქმნათ ორ ასო-ნიშნიანი ყველა ის დირექ-
u.
ერ
ტორია, რომელის დასახელებაც თვლის თექვსმეტობითი სისტემის სიმბოლოების ყველა კომ-
მუ
bt
ცნობილი დასახელებით, როგორც გაფართოებით, ასევე გაფართოების გარეშე. მხოლოდ გა-
მწ
სა
achiko@debian:∼$ ls
ბი
არ
sh
00 10 20 30 40 50 60 70 80 90 A0 B0 C0 D0 E0 F0
01 11 21 31 41 51 61 71 81 91 A1 B1 C1 D1 E1 F1
ნე
02 12 22 32 42 52 62 72 82 92 A2 B2 C2 D2 E2 F2
ra
ეს
03 13 23 33 43 53 63 73 83 93 A3 B3 C3 D3 E3 F3
შვ
ba
04 14 24 34 44 54 64 74 84 94 A4 B4 C4 D4 E4 F4
05 15 25 35 45 55 65 75 85 95 A5 B5 C5 D5 E5 F5
ნი
06 16 26 36 46 56 66 76 86 96 A6 B6 C6 D6 E6 F6
liz
07 17 27 37 47 57 67 77 87 97 A7 B7 C7 D7 E7 F7
შე
08 18 28 38 48 58 68 78 88 98 A8 B8 C8 D8 E8 F8
e
09 19 29 39 49 59 69 79 89 99 A9 B9 C9 D9 E9 F9
il.
ვთ
0A 1A 2A 3A 4A 5A 6A 7A 8A 9A AA BA CA DA EA FA
0B 1B 2B 3B 4B 5B 6B 7B 8B 9B AB BB CB DB EB FB
ch
0C 1C 2C 3C 4C 5C 6C 7C 8C 9C AC BC CC DC EC FC
ხო
0D 1D 2D 3D 4D 5D 6D 7D 8D 9D AD BD CD DD ED FD
ar
0E 1E 2E 3E 4E 5E 6E 7E 8E 9E AE BE CE DE EE FE
გთ
0F 1F 2F 3F 4F 5F 6F 7F 8F 9F AF BF CF DF EF FF
$ touch {{0..9},{A..F}}{{0..9},{A..F}}/file{0..9}{,.{t,T}{x,X}{t,T}}
39
achiko@debian:∼$ ls A0
file0 file1.TxT file3.tXt file5 file6.TxT file8.tXt
file0.txt file1.TXt file3.tXT file5.txt file6.TXt file8.tXT
file0.txT file1.TXT file3.Txt file5.txT file6.TXT file8.Txt
file0.tXt file2 file3.TxT file5.tXt file7 file8.TxT
file0.tXT file2.txt file3.TXt file5.tXT file7.txt file8.TXt
:
file0.Txt file2.txT file3.TXT file5.Txt file7.txT file8.TXT
ზე
file0.TxT file2.tXt file4 file5.TxT file7.tXt file9
file0.TXt file2.tXT file4.txt file5.TXt file7.tXT file9.txt
ა
file0.TXT file2.Txt file4.txT file5.TXT file7.Txt file9.txT
სტ
file1 file2.TxT file4.tXt file6 file7.TxT file9.tXt
file1.txt file2.TXt file4.tXT file6.txt file7.TXt file9.tXT
ა!
ო
file1.txT file2.TXT file4.Txt file6.txT file7.TXT file9.Txt
სი
ფ
file1.tXt file3 file4.TxT file6.tXt file8 file9.TxT
file1.tXT file3.txt file4.TXt file6.tXT file8.txt file9.TXt
ge
.
file1.Txt file3.txT file4.TXT file6.Txt file8.txT file9.TXT
ელ
ვე
u.
ახლა შექმნილი ფაილებიდან შევეცადოთ გამოვიტანოთ მხოლოდ ისინი, რომლებიც
განთავსებულია დირექტორიებში, რომელთა დასახელებაც არ შეიცავს ციფრს, B, E და F ასო-
ო
ed
თ
ებს და თავად ფაილის გაფართოება კი მხოლოდ დიდ X შეიცავს, პატარას არა.
შა
u.
ერ
achiko@debian:∼$ ls [^0-9BEF][!0-9BEF]/*.?X?
მუ
bt
...
მწ
li@
AC/file6.tXt CA/file4.tXt CD/file2.tXt DC/file0.tXt DD/file8.tXt
მო
ba
liz
როგორც ზემოთ აღვნიშნეთ, გამოტოვებით არის გამოყოფილი. მაშ, როგორ შეიძლება შევ-
შე
ქმნათ ისეთი ფაილი, რომლის დასახელებაშიც დაშორება შედის? მაგალითად, ფაილი სახელად
name surname.
e
il.
ვთ
name და surname. ჩვენი კი ერთი ფაილის შექმნა გვსურს სახელად name surname.
გთ
40
1. ” (ბრჭყალი) – ასო-ნიშანი ან ასო-ნიშანთა ერთობლიობა, რომელთა მნიშვნელობების
დაკარგვაც გვურს, უნდა მოვათავსოთ ბრჭყალებში. ბრჭყალით ვერ ვუკარგავთ მნიშვნე-
ლობას ოთხ სპეციალურ ასო ნიშანს. ესენია:
$ (დოლარის სიმბოლო)
:
ზე
\ (უკან გადახრილი წილადის ხაზი, ანუ ბექსლეში)
ა
” (თავად ბრჭყალი)
სტ
` (მკვეთრი მახვილი2 )
ა!
ო
სი
ფ
2. ’ (აპოსტროფი) - ასო-ნიშანი ან ასო-ნიშანთა ერთობლიობა, რომელთა მნიშვნელობების
რ
დაკარგვაც გვსურს, უნდა მოვათავსოთ აპოსტროფებს შორის, როგორც ბრჭყალის გამო-
ge
.
ელ
ყენების შემთხვევაში. ამ დროს ყველა ასო-ნიშანს ეკარგება მნიშვნელობა, გარდა თავად
აპოსტროფისა.
ვე
u.
ო
ed
თ
3. \ (ბექსლეში (backslash), უკან გადახრილი წილადის ხაზი) - ასო-ნიშანს, რომლის მნიშ-
შა
ე
ვნელობის დაკარგვაც გვსურს, წინ უნდა მივუწეროთ ბექსლეში. ეს მეთოდი უნივერსალუ-
u.
ერ
რია და ის ყველა ასო-ნიშანს უკარგავს თავის მნიშვნელობას.
მუ
bt
მწ
სა
li@
მო
vi
sh
ნე
ar
ბექსლეშით კი ასეთი:
გთ
2
მკვეთრი მახვილი (grave accent) qwerty კლავიატურაზე ტაბულაციის კლავიშის მაღლაა განთავსებული.
41
ყურადღება
:
ზე
ლებაში ნებისმიერი სიმბოლოს გამოყენებაა შესაძლებელი გარდა / სიმბოლოსი.
ა
ფაილი, რომლის სახელიც წერტილით (.) იწყება ითვლება დაფარულად. დაფარული
სტ
იმ გაგებით, რომ ls ბრძანებით ის ეკრანზე არ გამოჩნდება. ამისთვის ls ბრძანება a
ოფციით უნდა გავუშვათ, ასე: ls -a. მომხმარებლის ანგარიშის შექმნისას პირად დირექ-
ა!
ო
ტორიაში შეგხვდებათ რამდენიმე დაფარული ფაილი და დირექტორია. ისინი საჭიროა
თქვენი სამუშაო გარემოს დასაკონფიგურირებლად. დეტალურად მათ მოგვიანებით და-
სი
ფ
ვუბრუნდებით.
ge
.
ელ
4.3 ფაილების ასლების შექმნა, გადატანა, წაშლა
ვე
u.
ჩვენ უკვე ვიცით ფაილებისა და დირექტორიების შექმნა. ახლა ვნახოთ, როგორ უნდა
ო
ed
თ
მათი კოპირება, გადატანა და წაშლა.
შა
u.
რექტორიიდან სხვა დირექტორიაში, უნდა გავუშვათ ეს ბრძანება:
ერ
მუ
bt
მწ
li@
მო
vi
ბი
არ
ra
შვ
ba
liz
e
il.
ოფციები მნიშვნელობა
ვთ
ch
42
-u, ერთი დირექტორიიდან მეორეში ფაილების გადაწერისას მხოლოდ იმ ფა-
--update ილებს აკოპირებს, რომლებიც მეორე დირექტორიაში არ არსებობს. ხო-
ლო თუ არსებობს, მათი განახლება მხოლოდ იმ შემთხვევაში მოხდება,
თუ პირველ დირექტორიაში დასაკოპირებელი ფაილი უფრო ახალია, ვიდ-
რე მეორე დირექტორიაში არსებული ფაილი.
:
-a, აკოპირებს ფაილებსა და დირექტორიებს და თან უნარჩუნებს მათ ატრი-
ზე
--archive ბუტებს (წვდომის უფლებებზე მოგვიანებით გვექნება საუბარი).
ა
-v,--verbose კოპირების პროცესის დეტალები ჩანს ეკრანზე.
სტ
სხვა ოფციების სანახავად იხილეთ cp ბრძანების სახელმძღვანელო გვერდი: man cp.
ა!
ო
mv ბრძანებით, cp-სგან განსხვავებით, არ ვაკოპირებთ, არამედ ერთი ადგილიდან მეო-
სი
ფ
რეში გადაგვაქვს ფაილები და დირექტორიები. მოვიყვანოთ მაგალითი:
ge
.
ელ
ვე
achiko@debian:∼$ mv file1 file2 ... dir1 dir2 ... directory
u.
ო
ამ ბრძანებით კი შესაძლებელია ფაილის სახელის გადარქმევა:
ed
თ
შა
u.
achiko@debian:∼$ mv file1 file2
ერ
მუ
bt
-i, -u და ისინი -v ოფციები mv ბრძანებასაც შეგვიძლია გადავცეთ და მათი მნიშვნე-
მწ
სა
li@
ლობა ამ ბრძანებისთვისაც იგივე იქნება, რაც cp-ს შემთხვევაში.
rm ბრძანებით შეგვიძლია წავშალოთ ფაილები და დირექტორიები. ასე:
მო
ის
vi
achiko@debian:∼$ rm file1
ბი
არ
sh
ra
ეს
შვ
ოფციები მნიშვნელობა
ba
ნი
--recursive
e
ch
ხო
43
achiko@debian:∼$ rm -rf file* ??
ყურადღება
:
ნებით მიმდინარე დირექტორიაში წაიშლება ყველაფერი, ხოლო მეორე ბრძანება კი სის-
ზე
ტემის ძირეული დირექტორიიდან დაწყებული ყველა ფაილს წაშლის!
ა
სტ
ა!
ო
სი
ფ
რ
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
44
თავი 5
:
ა ზე
გადამისამართება
სტ
ა!
ო
სი
ფ
გ ადამისამართების შესაძლებლობა ლინუქსში ამოცანების გადაწყვეტას ძალიან ამარ-
ტივებს. როდესაც shell-ში ფაილების ბრძანებებით მართვა გვსურს, შეტან/გამოტანის
ge
.
ელ
(Input/Output) ნაკადების ცოდნა მნიშვნელოვნად ამაღლებს პროდუქტიულობას.
ვე
ლინუქსში ბევრი ბრძანება ეკრანზე გვაჩვენებს შედეგს. უფრო ტექნიკურად რომ
u.
ავხსნათ, ბრძანების ეს შედეგი მიმართულია სტანდარტული გამოსასვლელისკენ (standart
ო
ed
output - stdout). თუ ბრძანება წარუმატებლად დასრულდა, ამ შემთხვევაში შედეგი მიმარ-
თ
თული იქნება შეცდომების სტანდარტული გამოსასვლელისკენ (standart error - sterr). ორივე
შა
ე
შემთხვევაში, სტანდარტული გამოსასვლელიცა და შეცდომების გამოსასვლელიც შეესაბამება
u.
ერ
ეკრანს, რადგან აქ ვხედავთ ყოველგვარ შედეგს.
მუ
bt
Unix-ში, როგორც აღვნიშნეთ, ყველაფერი ფაილია და ბრძანებები, მაგალითად ls, თა-
მწ
ვის შედეგს, ანუ მიმდინარე დირექტორიაში არსებულ ფაილების სიას, აგზავნის სპეციალური
სა
li@
ფაილისკენ, რომელსაც სტანდარტულ გამოსასვლელს ვუწოდებთ, ხოლო შეცდომის შედეგს კი
მო
ba
liz
სისტემურ ბლოკთან.
ხო
ar
45
ლინუქსის გარემოში შეტან გამოტანა ხორციელდება სამი ნაკადით და ეს ნაკადები
შემდეგნაირადაა დანომრილი (სურ. 5.1):
:
ა ზე
სტ. გამ. (1)
ბინარული ფაილი,
სტ
სტ. შეს. (0)
პროგრამა
შეც. გამ. (2)
ა!
ო
სურ 5.1: ბრძანების შესრულების ორგანიგრამა
სი
ფ
0, 1-სა და 2-ს ფაილის დესკრიფტორები (file descriptor, მოკლედ fd) ეწოდება და, რო-
ge
.
ელ
გორც უკვე აღვნიშნეთ, ნაგულისხმევი მნიშვნელობით, ეკრანისკენაა მიმართული. ლინუქსში
ვე
ჩვენ გვაქვს იმის საშუალება, რომ შეტან/გამოტანის მიმართულება შევცვალოთ.
u.
ო
ed
თ
5.1 სტანდარტული გამოსასვლელი
შა
u.
ერ
სტანდარტული გამოსასვლელში არსებულ ნაკადს მიმართულება რომ შევუცვალოთ
მუ
bt
რატორს > (მეტობის ნიშანი). ხშირად სასარგებლოა, გამოსული ინფორმაცია ფაილში დავი-
მწ
სა
სასვლელის გადამისამართება.
ის
vi
ბი
არ
achiko@debian:∼$ ls 1>file
sh
ნე
ra
”
გადამისამართებას ვასრულებთ, რადგან ფაილის დესკრიფტორი - 1 stdout -ს შეესაბამება.
შვ
”
ba
თუმცა, მხოლოდ > ოპერატორის ჩაწერა, 1 -ის გარეშეც ავტომატურად გულისხმობს სტან-
” ”
დარტული გამოსასვლელის გადამისამართებას. შესაბამისად, ეს ბრძანება შემდეგნაირადაც
ნი
შეიძლება დავწეროთ:
liz
შე
achiko@debian:∼$ ls >file
il.
ვთ
”
მასში დამახსოვრებული ინფორმაცია დაიკარგება. თუ გვსურს, რომ stdout არ გადაეწეროს
ხო
ფაილს, არამედ ამ უკანასკნელის შიგთავსის ბოლოს დაემატოს, მაშინ >> (ორი მეტობის
ar
”
ნიშანი) ოპერატორი უნდა გამოვიყენოთ, ასე:
გთ
achiko@debian:∼$ ls 1>>file
46
ლი ჩანაწერი შემდეგნაირია:
achiko@debian:∼$ ls >>file
:
ზე
ხშირად გაშვებული ბრძანება წარმატებით არ სრულდება. მიზეზი შეიძლება ბევრი
იყოს: შეიძლება ბრძანებაზე გადაცემული არგუმენტი არ არსებობდეს, ან ბრძანება სინტაქ-
ა
სურად არასწორად იყოს ჩაწერილი, თუნდაც კლავიატურიდან შეცდომით აკრეფის ან სხვა მი-
სტ
ზეზის გამო.
ასეთ დროს ეკრანზე გამოდის შეცდომის მესიჯი და შეცდომის ეს ტექსტი ეკრანზე ბრძა-
ა!
ო
ნების შეცდომების გამოსასვლელიდან ხვდება.
სი
ფ
achiko@debian:∼$ lss
ge
.
-bash: lss: command not found
ელ
ვე
u.
თუ გვსურს ეს შეტყობინება ეკრანზე აღარ დაიწეროს და ის გადამისამართდეს სხვა
ფაილისკენ, მაშინ გადამისამართების ოპერატორი უნდა გამოვიყენოთ, ასე:
ო
ed
თ
შა
u.
achiko@debian:∼$ lss 2>file error
ერ
მუ
bt
>> (ორი მეტობის ნიშანი) გამოყენების შემთხვევაში შეცდომის ტექსტი file error-ს
მწ
”
სა
ბოლოში მიემატება.
li@
ხშირ შემთხვევაში, სასურველია, ყველა გამოსასვლელი ერთ ფაილში გადამისამართდეს.
მო
vi
ბი
არ
ra
ba
bash-ის ახალ ვერსიაში უფრო გამარტივებული ხერხი არსებობს. მასში ძველი ვარიან-
liz
ტიც მუშაობს.
შე
e
il.
ch
ჩვენ შეგვიძლია, აგრეთვე, stout დან sterr მივამატოთ ფაილს ბოლოში. ასე:
ხო
ar
47
achiko@debian:∼$ command 2>/dev/null
:
ზე
აქამდე ჯერ არ შეგვხვედრია ბრძანება, რომელშიც მისი სტანდარტული შესასვლელი
ა
გამოგვეყენებინოს. მოდით, ერთ-ერთი მათგანი განვიხილოთ: cat ბრძანება კითხულობს ერთ
სტ
ან რამდენიმე ფაილს და მათი შიგთავსი გამოაქვს სტანდარტულ გამოსასვლელზე, ასე:
ა!
ო
achiko@debian:∼$ cat [file1 file2 ...]
სი
ფ
cat ბრძანებით ვნახულობთ რა წერია ფაილში. რამდენიმე ფაილის შემთხვევაში, ეს
ge
.
ბრძანება მათ შიგთავსებს მიაჯრის ერთანეთს და ისე გვანახებს ეკრანზე. ანუ cat შიგთავსების
ელ
მიჯრას, კონკატენაციას აკეთებს.
ვე
u.
რა მოხდება თუ cat ბრძანებას არგუმენტს არ მივუწერთ?
ო
ed
თ
შა
achiko@debian:∼$ cat
ე
u.
ერ
მუ
bt
არც არაფერი. ერთი შეხედვით, იქმნება შთაბეჭდილება, რომ ბრძანება დაეკიდა ,
”
მწ
li@
შესასვლელს და რადგან სტანდარტული შესასვლელი, ნაგულისხმევი მნიშვნელობით, კლავი-
მო
მოდით ვცადოთ, ავკრიფოთ ტექსტი და ჯერ Enter -ს, შემდეგ კი Ctrl-d -ს დავაჭიროთ ( Ctrl
vi
of file-სკენ (EOF) მიუთითებს და ეუბნება, რომ მის სტანდარტულ შესასვლელზე მეტი ტექსტის
sh
ra
შედეგი ის იქნება, რომ cat დააკოპირებს stdin-ს stdout-ში, და, შესაბამისად, ჩვენი
ეს
ba
ნი
achiko@debian:∼$ cat
liz
text
შე
text
e
il.
ვთ
cat ბრძანების ასეთი ქცევა საშუალებას გვაძლევს, შევქმნათ მარტივი ტექსტური ფაი-
ლები, ასე:
ch
ხო
ar
ხაზი 1
ხაზი 2 [enter]
ხაზი 2
48
achiko@debian:∼$ cat file.txt
ხაზი 1
ხაზი 2
:
ზე
შესასვლელსაც.
< ოპერატორით (ნაკლებობის ნიშანი) ჩვენ შეგვიძლია ბრძანების სტანდარტული შე-
”
ა
სასვლელზე, კლავიატურიდან შეყვანილი მონაცემების ნაცვლად, მონაცემები ფაილიდან შე-
სტ
ვიყვანოთ.
ა!
ო
achiko@debian:∼$ cat <file.txt
სი
ხაზი 1
ფ
ხაზი 2
ge
.
ელ
შედეგი იგივე იქნება. ეს ბრძანებაც იმას გვანახებს, რაც file.txt-ში წერია. პრაქტი-
ვე
u.
კაში ასეთ ჩანაწერს დიდი გამოყენება არ აქვს, თუმცა ეს მაგალითი კარგი დემონსტრირებაა
იმისა, თუ როგორ შეგვიძლია სტანდარტული შესასვლელი ფაილიდან წავიკითხოთ. სხვა ბრძა-
ო
ed
თ
ნებებზე მისი გამოყენება გაცილებით სასარგებლოა. მათ მოგვიანებით დავუბრუნდებით.
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
49
გთ
ხო
ვთ ეს
ar შე არ
ch ნი ის
შვ სა
il. ნე
eliz ბი მუ
შა
ba მო ო
ra მწ ვე
sh ერ რ
vi
li@ ე თ
სი
ა!
bt ელ
u. .
ფ
ed ო
u. სტ
ge აზე
:
თავი 6
:
ა ზე
ბრძანებების გადაბმა
სტ
ა!
ო
სი
ფ
ლ
ინუქსში, ბრძანებათა ხაზში მუშაობისას, შესაძლებელია რამდენიმე ბრძანების ერთ
ხაზში ჩაწერა. ბრძანებების შესასრულებლად მათი დაჯგუფების ასეთი ფორმა უფრო
ge
.
ელ
კომპაქტურია, ვიდრე ტრადიციული მეთოდით მათი რამდენიმე ხაზში განაწილება.
ვე
აგრეთვე, ბრძანებების ერთ ხაზში ჩაწერას ის უპირატესობა აქვს, რომ ცალკეული
u.
ბრძანების შესრულებისთვის საჭირო დროს ლოდინში არ დავკარგავთ, არამედ შელი მათ ავ-
ო
ed
ტომატურად გაუშვებს.
თ
შა
u.
6.1 ოპერატორები
ერ
მუ
bt
ბრძანებების შეერთებისთვის, ერთ ხაზში ჩაწერისა და გაშვებისთვის, ლინუქსში რამ-
მწ
სა
; წერტილ-მძიმე
ის
vi
&& ლოგიკური და
ბი
არ
|| ლოგიკური ან
sh
ნე
შვ
ba
liz
ლია ვიგულისხმოთ. ეს ჩანაწერი ნიშნავს იმას, რომ ჯერ პირველი ბრძანება (cmd1) ეშვება და
e
სრულდება, შემდგ მეორე ბრძანება (cmd2) ეშვება და სრულდება და შემდეგ მესამე (cmd3).
il.
ვთ
ar
51
ამ შემთხვევაში, სასურველი იქნება, რომ ყოველი შემდეგი ბრძანება მხოლოდ მას შემ-
დეგ გაეშვას, თუ წინა წარმატებით დასრულდება. ამაში კი დაგვეხმარება პირობითი ოპერატო-
რი && და ბრძანებების ერთ ხაზში ჩაწერაც ასე მოხდება:
:
ზე
აქ, თუ პირველი ბრძანება (დირექტორიის შექმნა) წარმატებით არ შესრულდა, shell
შემდეგი ბრძანების (დირექტორიაში გადასვლა) შესრულებას აღარც ეცდება. ამ ბრძანების შეს-
ა
რულება, მხოლოდ მაშინ დაიწყება თუ პირველი წარმატებით დასრულდება. შესაბამისად, მესა-
სტ
მე ბრძანება (ფაილის შექმნა) მხოლოდ მაშინ გაეშვება, თუ მეორეც წარმატებით დასრულდება.
შეიძლება საინტერესო აღმოჩნდეს ბრძანების შესრულება იმ შემთხვევაში, თუ წინა
ა!
ო
ბრძანება წარუმატებლად შესრულდა. ასეთი ქმედება || პირობითი ოპერატორით შეიძლება
განხორციელდეს.
სი
ფ
ასე, მაგალითად:
ge
.
ელ
achiko@debian:∼$ ls file || touch file
ვე
u.
ო
ამ ბრძანებით მხოლოდ იმ შემთხვევაში ვქმნით ფაილს, თუ ფაილი file არ არსებობს.
ed
თ
ხოლო თუ ეს ფაილი არსებობს, ანუ ls file წარმატებით დასრულდა, მაშინ შემდეგი ბრძანება
შა
აღარ შესრულდება.
ე
u.
ერ
ჩვენი წინა მაგალითი ამ ოპერატორით ასეც შეგვიძლია წარმოვიდგინოთ:
მუ
bt
მწ
სა
vi
რია რომ არ არსებობს), მხოლოდ ამ შემთხვევაში შეიქმნება dir დირექტორია და ამის შემდეგ,
sh
თუ წარმატებით მოხდება მისი შექმნაც, მაშინ მასში შეიქმნება ფაილი file. ეკრანზე შეცდომის
ნე
შეტყობინების გამოტანაც ბუნებრივია, რადგან ის პირველ ბრძანებას ეხება (ის ხომ წარმატე-
ra
ეს
ბით არ შესრულდა). შეტყობინებაც სწორედ იმას გვამცნობს, რომ dir დასახელების მქონე
შვ
პირდაპირ მესამე ბრძანება შესრულდება, მეორე ბრძანება (mkdir dir) კი აღარ. ჩვენს ბრძა-
ხო
ახლა კი აღარაფერი შეიქმნება, რადგან dir დირექტორიაში file ფაილი უკვე არსე-
ბობს. არც გადაეწერება, რადგან touch ბრძანება უკვე შექმნილი ფაილის შიგთავსს არ ეხება.
52
6.2 მილი
:
ზე
შუალებაც. მაგალითად, შეგვიძლია ერთი ბრძანების შედეგი დასამუშავებლად სხვა ბრძანებას
გადავცეთ.
ა
ბრძანების უნარი გადასცეს მისი სტანდარტული გამოსასვლელი სხვა ბრძანებას სტან-
სტ
დარტულ შესასვლელზე, shell-ში ხორციელდება მილით (pipeline, მოკლედ pipe). მისი შესა-
ბამისი ოპერატორია | (ვერტიკალური ხაზი).
ა!
ო
სი
ფ
achiko@debian:∼$ cmd1 | cmd2
ge
.
ელ
ამ ჩანაწერით cmd1-ის სტანდარტული გამოსასვლელი შევა cmd2-ის სტანდარტულ შე-
სასვლელზე და შესრულდება.
ვე
u.
ჩვენთვის უკვე ნაცნობ less ბრძანებას შეუძლია სტანდარტულ შესასვლელზე მონაცე-
ო
ed
თ
მების მიღება. შესაბამისად, ნებისმიერი ბრძანების გამოსასვლელი გრძელი ტექსტი შეგვიძლია
შა
u.
ერ
მუ
bt
achiko@debian:∼$ ls /bin /usr/bin | less
მწ
სა
li@
/bin და /usr/bin დირექტორიების დათვალიერება ახლა გაცილებით მოსახერხებელი
მო
გახდა.
ის
vi
sh
53
სტ. შეს.
პროგრამა 1 შე
ც.
გა
მ.
სტ. გამ.
:
ზე
შეც. გამ. ტერმინალის
კლავიატურა პროგრამა 2
ეკრანი
ა
სტ
სტ. გამ.
.
ამ
.გ
ა!
ეც
ო
შ
.
ამ
სი
ფ
გ
ს ტ.
პროგრამა 3
ge
.
ელ
ვე
u.
სურ 6.1: სამი ბრძანების მილით გადაბმის ორგანიგრამა
ო
ed
თ
შა
u.
achiko@debian:∼$ ls /bin /usr/bin | sort | uniq | less
ერ
მუ
bt
ბრძანება wc-ს საშუალებით ვითვლით თუ რამდენი ხაზი, სიტყვა და ბაიტია (ლათინური
მწ
სა
li@
ტექსტის შემთხვევაში რამდენი ასო-ნიშანია) ფაილში.
მო
ის
achiko@debian:∼$ wc LICENSE.txt
vi
sh
ra
რაოდენობა. თუ მხოლოდ ერთ-ერთი მონაცემის ნახვა გვსურს, მაშინ შესაბამისი ოფცია უნდა
ეს
შვ
მივუთითოთ wc ბრძანებას.
ba
ნი
ოფციები მნიშვნელობა
liz
შე
დასათვლელად).
ar
გთ
54
achiko@debian:∼$ ls /bin /usr/bin | sort | uniq | wc -l
:
ზე
achiko@debian:∼$ ls /bin /usr/bin | sort | uniq | grep "zip"
bunzip2
ა
სტ
bzip2
bzip2recover
funzip
ა!
ო
gpg-zip
სი
ფ
gunzip
gzip
ge
.
p7zip
ელ
preunzip
ვე
u.
prezip
prezip-bin
ო
ed
თ
unzip
შა
unzipsfx
ე
u.
zipdetails
ერ
მუ
zipgrep
bt
zipinfo
მწ
სა
li@
მო
რება და მათ ეკრანზე ვეღარ ვხედავთ. ხშირად სასურველია, ეს მონაცემები ეკრანზეც დავინა-
sh
ba
ნი
ასე ls.txt-ში ჩაიწერება ls /bin /usr/bin ბრძანების შედები და მას ეკრანზე ვე-
”
e
ch
...
ar
zenity
zipdetails
გთ
zipgrep
zipinfo
55
ლირდება. Ctrl-d კლავიშების კომბინაციით დავასრულებთ პროცესს.
:
ხაზი 2
ზე
[Ctrl-d]
ა
სტ
ასე, ჩვენ მიერ კლავიატურიდან შეტანილი ტექსტი file.txt ფაილის შიგთავსს თავზე
გადაწერება. -a ოფციით კი ტექსტი ფაილის ბოლოში დაემატება.
ა!
ო
სი
ფ
achiko@debian:∼$ tee -a file.txt
ხაზი 3 [enter]
ge
ხაზი 3
.
ელ
ხაზი 4 [enter]
ხაზი 4 ვე
u.
[Ctrl-d]
ო
ed
თ
achiko@debian:∼$ cat file.txt
ხაზი 1
შა
u.
ხაზი 2
ერ
ხაზი 3
მუ
bt
ხაზი 4
მწ
სა
li@
ამ თავში განხილული ბრძანებებით წარმოდგენა შეგვექმნა ფილტრებზე. გაცილებით
მო
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
56
თავი 7
:
ა ზე
ტექსტური რედაქტორები
სტ
ა!
ო
სი
ფ
ა
ქამდე ფაილში სასურველი შიგთავსის განთავსებას გადამისამართებით ან tee ბრძანე-
ბით ვახერხებდით. მოდით, ახლა სრულფასოვანი ტექსტური რედაქტორები განვიხილოთ.
ge
.
ელ
ზოგადად, ოპერაციულ სისტემებში ტექსტური რედაქტორი ძალიან მნიშვნელოვან კომ-
ვე
პონენტს წარმოადგენს. მისი საშუალებით ხდება ტექსტური ფაილების შექმნა, კოდების
u.
დაწერა, კონფიგურაციის ფაილების რედაქტირება და სხვა. ამ მხრივ, ლინუქსში საკმაოდ ფარ-
ო
თო არჩევანი გვაქვს. ტექსტური რედაქტორები არსებობს როგორც გრაფიკულ გარემოში (GUI),
ed
თ
ისე ბრძანებათა ხაზში (CLI) სამუშაოდ.
შა
ე
ჩამოვთვალოთ რამდენიმე ცნობილი, ღია კოდის მქონე ტექსტური რედაქტორი:
u.
ერ
მუ
bt
vi/vim მძლავრი CLI ტექსტური რედაქტორი. vim Unix-ის ძველი ტექსტური
მწ
li@
ერთი ყველაზე პოპულარული და ფართოდ გამოყენებადი პროგრამაა
მო
მოცდილი მომხმარებლებისთვის.
ბი
არ
sh
ba
liz
გარემოში.
შე
openoffice
ar
გთ
57
LaTeX (LATEX) LATEX სისტემები გამოიყენება პროფესიონალური, სამეცნიერო სტა-
ტიებისა და წიგნების შესაქმნელად. ცნობილია TEX -ის შემდეგი დის-
ტრიბუტივები: TeX Live, teTeX, MikTeX და ა.შ. ეს დისტრიბუტივე-
ბი, თავის მხრივ, შეიცავენ ტექსტურ რედაქტორებს, რომლებიც ჩვენ-
თვის ტექსტთან სამუშაოდ მიჩვეული პროგრამებისგან განსხვავებით,
არ წარმოადგენს WYSIWYG ( What You See Is What You Get ) სის-
:
”
ზე
ტემას. WYSIWYG პროგრამების ის კატეგორიაა, სადაც დარედაქტი-
რებული ფაილის საბოლოო სახე (ამობეჭდვის შემდეგ) იგივე იქნება,
ა
რაც ვიზუალურად ჩანს მისი შექმნისას ეკრანზე. პირველი ნამდვი-
სტ
ლი WYSIWYG ტექსტური რედაქტორი, სახელად bravo, 1974 წელს
შეიქმნა Xerox PARC კომპანიაში და შემდეგ, მაიკროსოფთის ორი
ა!
პროდუქტის, ასევე WYSIWYG ტიპის - word და excel-ის საძირკვე-
ო
ლი გახდა. LATEX -ის სისტემებში ცნობილი ტექსტური რედაქტორებია
სი
ფ
- TeXmaker, TeXstudio, TeXworks და სხვა.
ge
.
ელ
7.1 რედაქტორი - vi/vim
ვე
u.
მოდით, გავიცნოთ ერთ-ერთი ყველაზე გავრცელებული, ეკრანზე ორიენტირებული ტექ-
ო
ed
თ
სტური რედაქტორი vi და მისი შესაძლებლობები. ის ყველა Linux სისტემაშია წარმოდგენილი.
შა
ე
რატომ vi? თანამედროვე ეპოქაში, როდესაც უამრავ გრაფიკულ რედაქტორთან ერ-
u.
ერ
თად, უმარტივესი, მოსახმარად ადვილი არაგრაფიკული რედაქტორები არსებობს, რატომ გვე-
მუ
bt
ამისთვის რამდენიმე მიზეზი არსებობს: vi ყოველთვისაა ხელმისაწვდომი. ის არის თა-
მწ
სა
ვისუფალი პროგრამა და მისი კოდი ღიაა. vi სწრაფია და კომპიუტერის ძალიან ცოტა რესურსს
li@
მოიხმარს. ამავდროულად, vi მორგებულია სწრაფი ბეჭდვისთვის. გამოცდილ მომხმარებელს
მო
ტექსტის აკრეფისას თითქმის არასოდეს მოუწევს თითების აწევა კლავიატურიდან. გარდა ამი-
ის
vi
სა, vi-ს ყოველი ინსტრუქცია ძალან კარგად არის დოკუმენტირებული და მისი მრადამჭერი
საზოგადოება ძალიან დიდია. vi განვრცობადია, მისი ფუნქციონალი უამრავი საინტერესო და-
ბი
არ
sh
მების ბევრი ენის სინტაქსია მხარდაჭერილი. nano რედაქტორი, რომლის პოპულარობაც დღი-
ra
ეს
მოითხოვს vi-ს არსებობას სისტემაში. სწორედ ამიტომ vi რედაქტორი Unix-ის მსგავს სისტე-
ba
vi-ს გაუმჯობესებულ ვერსიას ჰქვია vim (Vim IMproved). ბევრ სისტემაში vim-ის დაყე-
liz
ნების შემდეგ, ის vi-ს მალსახმობი ხდება და vi-ს გამოძახება, სინამდვილეში, vim-ის გაშვებას
შე
achiko@debian:∼$ vi file.txt
~
ch
~
ხო
~
ar
~
გთ
~
~
~
~
"file.txt" [New File] 0,0-1 All
58
თუ file.txt არსებობს, მისი შიგთავსი გაიხსნება რედაქტირებისთვის, თუ არა არსე-
ბობს, ის შეიქმნება. ხაზების წინ ტილდა (∼) მიუთითებს იმაზე, რომ ეს ხაზი ჯერ გამოყენებული
არ არის, ანუ ცარიელია. ბოლო ხაზზე, რომელიც სტატუსის ხაზს (statusline) წარმოადგენს,
დეტალური ინფორმაციაა ნაჩვენები (რომელ ხაზზე და მერამდენე სიმბოლოზე დგას კურსორი
და ეკრანზე შიგთავის რა ნაწილი ჩანს). vi რედაქტორში, ფაილის გახსნის შემდეგ, ავტომა-
ტურად აღმოვჩნდებით ე.წ. ბრძანებათა რეჟიმში (ე.წ. Command mode). ამ რეჟიმში კლავიშზე
დაჭერისას მისი შესაბამისი გრაფიკული გამოსახულება ეკრანზე არ გამოჩნდება. სამაგიეროდ,
:
ზე
შესრულდება ბრძანება, რომელიც vi-ში ამ კლავიშის ქვეშ იგულისხმება. სწორედ ამიტომ ჰქვია
ამ რეჟიმს ბრძანების რეჟიმი. ტექსტის შესაყვანად კი აკრეფის რეჟიმში (ე.წ. Insert mode) უნდა
ა
გადავიდეთ. იქ უკვე კლავიატურის კლავიშებით შესაბამისი ასო-ნიშნების ჩაწერას შევძლებთ
სტ
ფაილში. ამ რეჟიმში გადასასვლელად საკმარისია i -ს დავაჭიროთ. შედეგად, სტატუსის ხაზზე
გაჩნდება ჩანაწერი INSERT, რომელიც მიგვითითებს იმას, რომ აკრეფის რეჟიმში ვიმყოფებით.
ა!
ო
აქ უკვე შეგვიძლია ტექსტის აკრეფა.
სი
ფ
achiko@debian:∼$ vi file.txt
ge
.
The word "pheasant" (ხოხობი) ultimately comes from Phasis, the ancient
ელ
name of what is now called the Rioni River in Georgia. It passed from
ვე
u.
Greek to Latin to French (spelled with an initial "f") then to English,
appearing for the first time in English around the year 1299.
ო
ed
თ
~
შა
~
ე
u.
~
ერ
მუ
bt
~
მწ
~
სა
li@
~
მო
~
ის
sh
ბების შემდეგ, ისეთ სიტუაციაში აღმოჩნდით, რომ დაიბენით და ვერ ხვდებით რომელ რეჟიმში
ra
ეს
ხართ, მაშინ გამოსვლის ღილაკს, Esc -ს, ორჯერ დააჭირეთ და, ავტომატურად, ბრძანების
შვ
რეჟიმში აღმოჩნდებით.
ba
მაშინ :q! .
e
59
b კურსორის გადაადგილება წინა სიტყვაზე მარცხნივ. 2b - კურსორი გადავა მარ-
ცხნივ, მე-2 სიტყვაზე.
:
^ კურსორის გადაადგილება მიმდინარე ხაზის დასაწყისში პირველ არაცარიელ
ზე
სიმბოლოზე.
ა
gg კურსორის გადაადგილება პირველი ხაზის დასაწყისში. 3gg - კურსორი გადავა
სტ
მე-3 ხაზის დასაწყისში.
ა!
ო
ხაზის დასაწყისში. 1G - ასე კი პირველი ხაზის დასაწყისში.
სი
ფ
Ctrl^f შემდეგ გვერდზე გადასვლა.
ge
.
Ctrl^b წინა გვერდზე გადასვლა.
ელ
ვე
u.
ო
ფაილის შიგთავსის რედაქტირების ბრძანებები
ed
თ
შა
u.
5x - 5 ასო-ნიშნის წაშლა კურსორიდან მარჯვნივ.
ერ
მუ
bt
X ერთი ასო-ნიშნის წაშლა კურსორმდე. 5X - 5 ასო-ნიშნის წაშლა კურსორამდე
მწ
მარცხნივ.
სა
li@
d წაშლა.
მო
sh
h მიმართულებით).
d4k - შლის მიმდინარე და ზედა 4 ხაზს.
ნე
ra
k მიმართულებით).
ეს
შვ
ილის მთლიანი შიგთავსის წაშლა გვსურს, მაშინ ჯერ კურსორი პირველ ხაზზე
liz
ასე: gg + dG
e
ar
p/P ჩასვამს კოპირებულ ტექსტს მომდევნო/წინა ახალ ხაზზე. ჩასმა ეხება აგრეთვე
x და d ბრძანებით წაშლილ ბოლო ტექსტებს, რადგან ეს ტექსტები ბუფერში
ინახება.
60
Ctrl^r გაუქმებამდე დაბრუნება. ანუ გაუქმების გაუქმება. (ე.წ. redo).
:
ზე
∼ პატარა ასო-ნიშანს დიდად გადააკეთებს და დიდს პატარად.
ა
J შემდეგი ხაზის შეერთება მიმდინარესთან.
სტ
/სიტყვა ტექსტში კურსორის შემდეგ მოძებნის სიტყვას . შემდეგ, სიტყვაზე გადასას-
” ”
ვლელად, უნდა დავაჭიროთ n -ს (next). წინაზე გადასასვლელად - N -ს.
ა!
ო
?სიტყვა სიტყვის ძიება კურსორის წინ.
სი
ფ
”
ge
.
ელ
აკრეფის რეჟიმში გადასვლა
ვე
u.
i გადავა აკრეფის რეჟიმში და ტექსტის აკრეფა დაიწყება კურსორის მიმდინარე პოზი-
ო
ed
თ
ციის წინ.
შა
I
ე
ტექსტის აკრეფა დაიწყება მიმდინარე ხაზის დასაწყისიდან.
u.
ერ
ტექსტის აკრეფა დაიწყება კურსორის შემდეგ.
მუ
bt
A ტექსტის აკრეფა დაიწყება მიმდინარე ხაზის ბოლოდან.
მწ
სა
li@
o მიმდინარე ხაზის შემდეგ ახალი ხაზი შეიქმება და იქ დაიწყება ტექსტის აკრეფა.
მო
O
vi
sh
ნე
ra
ეს
სხვა ბრძანებები
შვ
ba
ტყვა2 -ით.
:s/სიტყვა1/სიტყვა2/g შეიცვლება მიმდინარე ხაზსა და მის შემდგომ ყვე-
ch
ლა ხაზში.
ხო
ჩათვლით.
გთ
61
:n newfile.txt ასე, vi-ში ახალ ფაილს (newfile.txt) ვხსნით. თუ რამდენიმე ფაილი
გვაქვს გახსნილი, მაშინ წინა ან შემდეგ ფაილზე გადასვლა შეგვიძლია
:bp და :bn ბრძანებებით. :b ბრძანების აკრეფა და შემდეგ ტა-
ბულაციის ღილაკზე დაჭერა დაგვეხმარება გახსნილი ფაილების იდენ-
ტიფიცირებასა და არჩევაში.
:
:set nu ხაზების ნუმერაციის გამოჩენა.
ზე
:set nonu ხაზების ნუმერაციის გაქრობა.
ა
:set hlsearch ტექსტში ძებნისას სიტყვის სხვა ფერით მონიშვნა (ე.წ. highlight).
სტ
:noh highlight-ის გამორთვა.
ა!
ო
ბრძანებისა და აკრეფის რეჟიმების გარდა, vi-ში არსებობს ვიზუალური რეჟიმიც (ე.წ.
სი
ფ
Visual mode). ამ რეჟიმში ხდება ტექსტის მონიშვნა. მონიშნული ტექსტი ვიზუალურად გამოჩ-
ნდება და მასზე შეგვიძლია ვიმოქმედოთ vi-ს სხვადასხვა ბრძანებებით - წაშლა (d), კოპირება
ge
.
ელ
(y) ან სხვა. ვიზუალურ რეჟიმში გადასვლა შესაძლებელია v ბრძანებით, V ბრძანებით ან
ვე
Ctrl^v კლავიშების კომბინაციით. შემდეგ, ტექსტის მოსანიშნად e ბრძანება და სხვადასხვა
u.
მიმართულებების ღილაკები უნდა გამოვიყენოთ. ვიზუალურ რეჟიმი v ბრძანებით გადასვლა
ო
ed
საშუალებას მოგვცემს მოვნიშნოთ ტექსტის ფრაგმენტი ერთი ასო-ნიშნის სიზუსტით, V -ს შემ-
თ
თხვევაში - ხაზების სიზუსტით, ხოლო Ctrl^v -ს გამოყენებისას - ტექსტის ბლოკების სიზუსტით.
შა
ე
ასევე, მაუსით ტექსტის მონიშვნა ავტომატურად გამოიწვევს ვიზუალურ რეჟიმში გადასვლას.
u.
ერ
ფაილების გახსნა vi ტექსტურ რედაქტორში მხოლოდ კითხვის რეჟიმშიც შეგვიძლია.
მუ
bt
ეს შესაძლებლობას გვაძლევს თავი დავიზღვიოთ რაიმე შემთხვევითი ცვლილებისგან ფაილის
მწ
li@
მო
achiko@debian:∼$ vi -R file.txt # ან
ის
sh
გაუშვათ.
ba
ნი
achiko@debian:∼$ vimtutor
liz
შე
=======================================================================
e
= W e l c o m e t o t h e V I M T u t o r - Version 1.7 =
il.
ვთ
=======================================================================
ch
Vim is a very powerful editor that has many commands, too many to
ხო
be enough of the commands that you will be able to easily use Vim
გთ
as an all-purpose editor.
...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lesson 1.1: MOVING THE CURSOR
62
...
GNU Emacs ერთ-ერთი ყველაზე მძლავრი ტექსტური რედაქტორია მათ შორის, რომ-
:
ზე
ლებსაც, პირადად, ვიცნობ. მას აქვს ძალიან მდიდარი დოკუმენტაცია და უამრავი ფუნქცია
გაფართოვებების სახით. მასში ძალიან მარტივად მუშავდება ტექსტური დოკუმენტი, მოხერ-
ა
ხებულად ხდება აბზაცებზე, წინადადებებსა და სიტყვებზე გადასვლა. მას აქვს ძიების მძლავ-
სტ
რი მექანიზმი, იყენებს რა რეგულარულ გამოსახულებებს, კლავიატურის მაკროსებსა და სხვა.
Emacs ყველანაირი ტექსტის დამუშავებისათვის შეგვიძლია გამოვიყენოთ, როგორც დიდ ტექ-
ა!
ო
სტებზე სამუშაოდ, ასევე ყოველდღიური მარტივი ჩანაწერების გასაკეთებლად, პროგრამების
დასაწერად და სხვა. ის ყველანაირი გემოვნების ადამიანს დააკმაყოფილებს. მასში შეგიძლიათ
სი
ფ
ტეტრისი ითამაშოთ და ბევრი სხვა სახალისო რამ აღმოაჩინოთ. GNU Emacs, როგორც დასა-
ხელებიდან ჩანს, GNU პროექტის ფარგლებში შექმნილი პროდუქტია და დაწერილია C დაპ-
ge
.
ელ
როგრამების ენაზე. თავდაპირველი ვერსია თავად რიჩარდ სტალმანმა დაწერა. ამ პროგრამით
ვე
სარგებლობა შესაძლებელია ბევრ სხვადასხვა სისტემაზე, როგორიცაა: GNU/Linux, FreeBSD,
u.
NetBSD, OpenBSD, MacOS, MS Windows და Solaris.
ო
ed
სანამ GNU Emacs პროგრამას გავუშვებთ და სადემონსტრაციოდ პრაქტიკულ ღონი-
თ
ძიებებს მივმართავთ, ვთქვათ, თუ რას წარმოადგენს Emacs-ში ბუფერი. ეს ტერმინი ხშირად
შა
ე
შეგხვდება Emacs-ში მუშაობისას და ძალიან მნიშვნელოვანია მისი ცოდნა. ბუფერი emacs-ში
u.
ერ
არის ის ადგილი, სადაც ჩვენ სასურველ ტექსტს ვკრეფთ. შეგვიძლია ვთქვათ, რომ ყოველთვის
მუ
bt
ბუფერში ვმუშაობთ, უბრალოდ შესაძლებელია, ბუფერში არსებული ტექსტი შემდეგ ფაილში
მწ
li@
თუმცა, არ არის აუცილებელი, რომ ბუფერი რომელიმე ფაილთან იყოს კავშირში. ეს კი ძალი-
მო
მაგრამ კონკრეტულ მომენტში მხოლოდ ერთ ბუფერში შეგვიძლია მუშაობა. მას მიმდინარე
ბი
არ
ბუფერს უწოდებენ. ბუფერში, როგორც ვთქვით, ტექსტი ანუ ასო-ნიშნათა ერთობლიობა იწე-
sh
რება. დავსვათ კითხვა: რამდენი სიმბოლო შეიძლება ჩაეტიოს ბუფერში? აქვს მას საზღვარი?
ნე
რა თქმა უნდა, ასეთ გარემოში შეგიძლიათ მაუსის გამოყენება, თუმცა Emacs-ში არ-
ხო
ხდება.
GNU Emacs-ით სარგებლობა, ცხადია, არაგრაფიკულ გარემოშიც შეგიძლიათ. მისი პირ-
ველი ვერსია იმ დროს შეიქმნა, როდესაც გრაფიკული გარემო არც კი არსებობდა. ტექსტურ
რეჟიმში ამ პროგრამის გაშვება იგივენაირად, emacs ბრძანებით, შეგეძლებათ. ანუ, emacs-ის
გაშვება ტერნიმალის ემულატორში ახალი ფანჯრის შექმნას გამოიწვევს, ვირტუალური ტერმი-
ნალიდან კი სრულ ეკრანზე გაეშვება, ასე:
63
:
ა ზე
სტ
ა!
ო
სი
ფ
რ
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
li@
მო
ის
achiko@debian:∼$ emacs
vi
sh
(`C-' means use the CTRL key. `M-' means use the Meta (or Alt) key.
liz
If you have no Meta key, you may instead type ESC followed by the character.)
შე
Useful tasks:
e
GNU Emacs comes with ABSOLUTELY NO WARRANTY; type C-h C-w for full details.
Emacs is Free Software--Free as in Freedom--so you can redistribute copies
of Emacs and modify it; type C-h C-c to see the conditions.
Type C-h C-o for information on getting the latest version.
64
If an Emacs session crashed recently, type Meta-x recover-session RET
to recover the files you were editing.
:
ა ზე
სტ
ა!
ო
სი
ფ
რ
ge
.
-UUU:%%--F1 *GNU Emacs* All L1 (Fundamental) -----------------------
ელ
ვე
For information about GNU Emacs and the GNU system, type C-h C-a.
u.
ო
ed
თ
მოდით, ჩამოვთვალოთ Emacs-ის ძირითადი კლავიშების კომბინაციები:
შა
u.
ერ
ფაილის/ბუფერის გახსნა, შენახვა, დახურვა
მუ
bt
Ctrl^x + Ctrl^f ფაილის გახსნა. ამ კომბინაციზე დაჭერით ფაილის სახელი
მწ
li@
არსებობს, მისი შიგთავსი გაიხსნება, თუ არა, მაშინ ახალი
მო
ra
შვ
liz
Ctrl^x + b გადართვა შემდეგ ბუფერზე. შეყვანის ღილაკზე ( ) დაჭე-
შე
მოთავაზებულ ბუფერზე.
il.
ვთ
მნა ამ დასახელებით.
ar
65
Ctrl^x + Ctrl^c Emacs-დან გამოსვლა.
:
ზე
მჯრავალჯერ გამოყენება. Ctrl^ -ის ნაცვლად შეგიძლიათ Ctrl^/
-ც გამოიყენოთ.
ა
Ctrl^g + Ctrl^/ ბოლო გაუქმბის გაუქმება (Redo). Ctrl^g + Ctrl^/ + Ctrl^/ + ...
სტ
- მრავალი Redo.
ა!
ო
Ctrl + გამოტოვება მონიშვნის დაწყება.
სი
ფ
Ctrl^x + h ყველაფრის მონიშვნა (Select all).
ge
.
ელ
Ctrl^w მონიშნულის ამოჭრა (Cut).
ვე
u.
Ctrl^y ჩასმა (Paste).
ო
ed
თ
შა
u.
ერ
კურსორის მოძრაობა
მუ
bt
Ctrl^f კურსორის გადაადგილება მარჯვნივ ერთი ასო-ნიშნით. →
მწ
სა
li@
Ctrl^b კურსორის გადაადგილება მარცხნივ ერთი ასო-ნიშნით. ←
მო
vi
sh
ba
Meta^<
ნი
66
Ctrl^k კურსორის პოზიციიდან ხაზის ბოლომდე ყველა ასო-ნიშნის წაშლა.
:
ზე
Ctrl^s ტექსტში სიტყვის მოძებნა. Ctrl^s -ის დაჭერის შემდეგ უნდა შევიყ-
ვანოთ საძიებო სიტყვა, რომელიც ფანჯრის ბოლო ხაზზე გამოჩნდე-
ა
ბა. ასეთის არსებობის შემთხვევაში, Emacs სხვა ფერით მონიშნავს
სტ
მოძებნილს. კვლავ Ctrl^s -ზე დაჭერით შემდეგი შემთხვევა გაფე-
რადდება და ა.შ. წინა მოძებნილზე დაბრუნება Ctrl^r -ით ხდება.
ა!
ო
სასურველ, მოძენბილ შემთხვევაზე კურსორის გასაჩერებლად
სი
ფ
ღილაკი უნდა გამოვიყენოთ.
ge
.
emacs-ში მიმართულების სტანდარტული ღილაკებიც წარმატებით მუშაობს: ← , ↓ ,
ელ
ვე
↑ , → , Home , End , Page up , Page Down . თუ რომელიმე კლავიშების კომბინაციის
u.
აკრეფისას შეცდომა მოგივიდათ, Esc ღილაკზე რამდენჯერმე დაჭერით, ხშირ შემთხვევაში,
დაბრუნდებით საწყის მდგომარეობაში. ყოველი შემთხვევისთვის, ყურადღებით დააკვირდით
ო
ed
თ
სტატუსის ხაზს, სადაც გარკვეული მინიშნება შეიძლება გამოჩნდეს.
შა
ე
emacs-ში როდესაც მონიშნულ ფრაგმენტს ვაკოპირებთ, მისი ჩასმა ნებისმიერ ადგი-
u.
ერ
ლას, ნებისმიერი რაოდენობით შეგვიძლია. თუ ახალ ფრაგმენტს ვაკოპირებთ, ამ შემთხვევა-
მუ
bt
შემთხვევისათვის, თუ რამდენიმე ფრაგნემტის დამახსოვრება გსურთ ერთდროულად, მაშინ
მწ
სა
vi
ბი
არ
რეგისტრები
sh
ნე
ა.შ.).
ba
”
liz
შე
ar
მაკროსები
გთ
67
Ctrl^x + e მაკროსის ჩართვა, გაშვება კურსორის პოზიციაზე.
:
5-ჯერ გავიმეოროთ Meta^d . Ctrl^x + ) -ზე დაჭერით ვასრულებთ მაკროსის ჩაწერას.
ზე
შემდეგ, კურსორი გადავიყვანოთ სასურველ პოზიციაზე, საიდანაც გვსურს ამ ოპერაციების გა-
მეორება და Ctrl^x + e კლავიშების კომბინაციით გავუშვათ ეს მაკროსი. დავინახავთ, რომ
ა
დამახსოვრებული ინსტრუქციები კვლავ შესრულდება კურსორის ახალი პოზიციიდან.
სტ
რეგისტრებისა და მაკროსების არსებობა იშვიათი ფუფუნებაა ტექსტურ რედაქტორებ-
ში. მოდით, აღვნიშნოთ emacs-ის მორიგი ღირსშესანიშნაობა. ის განსაკუთრებით კარგად არის
ა!
ო
მორგებული დაპროგრამების სხვადასხვა ენებზე მუშაობისას. კოდის წერისას შესაძლებელია
რომელიმე ენის შესაბამის რეჟიმზე გადასვლა, რაც გამოიწვევს დაპროგრამების ამ კონკრეტუ-
სი
ფ
ლი ენის ხელსაწყოების მყისიერ დამატებას მენიუ-ში, რომელიც შექმნის პროგრამისტისთვის
მორგებულ გარემოს. ასევე, სხვადასხვა რეჟიმი შემოგთავაზებთ დამატებით ფუნქციას, რომე-
ge
.
ელ
ლიც არამხოლოდ დაპროგრამების ენებზე არის ორიენტირებული.
ვე
u.
ბუფერში მუშაობის სხვადასხვა რეჟიმები
ო
ed
თ
c-mode დაპროგრამების C ენაზე კოდის წერისთვის, ამ რეჟიმზე გადართვა მენიუში
შა
ე
დაამატებს ახალ გრაფას C , სადაც ამ ენისთვის საჭირო დამატებითი ხელსა-
u.
”
ერ
წყოები იქნება განთავსებული.
მუ
bt
c++-mode დაპროგრამების C++ ენის რეჟიმი.
მწ
სა
li@
asm-mode დაპროგრამების Assembly ენის რეჟიმი.
მო
vi
sh
ra
Objective C, Java, Javascript, Makefiles, AWK, python, perl, Pascal, Ruby, Tcl, SQL და
ეს
ა.შ. რა თქმა უნდა, შესაძლებელია emacs-ის მორგება დაპროგრამების ახალ ენაზეც. Emacs-
შვ
ba
”
დეგნაირად შეგიძლიათ ნახოთ: Meta^x + *-mode + tab .
liz
Emacs-ის ბუფერში გაუშვათ shell, სადაც ყველა ბრძანებების გაშვება შეგეძლებათ, რასაც შელ-
e
როგორიცაა vi, ის მთლიან ეკრანს იკავებს ტერნიმალში, როგორც უკვე იცით. სახელმძღვანე-
ch
ftp -ით შეგიძლიათ FTP სერვერთან დაკავშირება და ა.შ. Emacs-ის სრული შესაძლებლობების
ar
html_node/emacs/index.html
68
თავი 8
:
ა ზე
წვდომის უფლებები
სტ
ა!
ო
სი
ფ
ო
პერაციულ სისტემებში რამდენიმე მომხმარებლის ანგარიში შეიძლება იყოს შექმნი-
ge
ლი და სისტემით ხან ერთი მომხმარებელი სარგებლობდეს და ხან მეორე. Unix-ის
.
ელ
ოჯახის ყველა ოპერაციული სისტემა მრავალმომხმარებლიანი სისტემაა. მრავალმომ-
ვე
ხმარებლიანობა იმას ნიშნავს, რომ კომპიუტერთან ერთდროულად შეუძლია მუშაობა
u.
რამდენიმე მომხმარებელს. მიუხედავად იმისა, რომ ჩვეულებრივ კომპიუტერს, როგორც წესი,
ო
ed
თ
ერთი კლავიატურა და ერთი მონიტორი ახლავს თან, თუ კომპიუტერი ქსელშია ჩართული, რამ-
დენიმე მომხმარებელს ქსელური პროგრამის საშუალებით, ამ კომპიუტერთან დაკავშირება და
შა
u.
მასზე დისტანციურად მუშაობა მაინც შეუძლია.
ერ
მუ
bt
თებელი სისტემის ჩამოყალიბების დროსვე კარგად გათვალეს. აღვნიშნოთ თუ როგორი გარემო
მწ
სა
იყო მაშინ, როდესაც Unix იქმნებოდა. წლების წინ, სანამ კომპიუტერი პერსონალური გახდე-
li@
”
ბოდა (ახლა, ძირითადად, პერსონალურ კომპიუტერებს ვხვდებით - PC, Personal Computer),
მო
sh
ra
ეს
არ მისცემდა უფლებას.
ნი
liz
შე
ლებსა და დირექტორიებზე სრული კონტროლი აქვს, ის არის მათი მფლობელი. თავის მხრივ,
ხო
ხმარებლებსაც აწევრიანებს. მფლობელს აქვს იმის საშუალება, რომ ამ ჯგუფის წევრებს გა-
უზიაროს საკუთარი ფაილები და დირექტორიები და მისცეს მათზე გარკვეული სახის წვდომა.
გთ
მფლობელს დამატებით იმის საშუალებაც აქვს, რომ თავისი ჯგუფის წევრების გარდა, დანარჩენ
მომხმარებლებსაც მისცეს მსგავსი უფლება.
მოდით, დეტალურად გავიაროთ ეს საკითხები. უპირველეს ყოვლისა, ვნახოთ რომელი
მომხმარებლის სახელით ვართ შესული სისტემაში და რომელ ჯგუფს განეკუთვნება ეს მომხმა-
რებელი. shell-ში whoami ბრძანება ჩვენი მომხმარებლის სახელს გვეუბნება.
69
achiko@debian:∼$ whoami
achiko
:
achiko@debian:∼$ id
ზე
uid=1000(achiko) gid=1000(achiko) groups=1000(achiko),
24(cdrom), 25(floppy),29(audio),44(video),115(scanner)
ა
სტ
Linux სისტემებში როდესაც მომხმარებელი იქმნება, მას სახელის გარდა, ნომერი ენი-
ა!
ჭება - მომხმარებლის იდენტიფიკატორი ე.წ. UID (User ID). ამიერიდან სისტემაში ეს მომხმა-
ო
რებელი ცნობილია ამ ნომრით, UID-ით. ასევე, შექმნისთანავე მომხმარებელი წევრიანდება
სი
ფ
ჯგუფში - პირველად ჯგუფში (იგივე მომხმარებელი სხვა ჯგუფებშიც შეიძლება გაწევრიანდეს).
ამ ჯგუფსაც თავისი ნომერი აქვს - ჯგუფის იდენტიფიკატორი, GID (Group ID).
ge
.
ახლა უფრო გასაგები გახდა, რა გამოიტანა ეკრანზე id ბრძანებამ. ზოგადად, სისტე-
ელ
ვე
მაში შექმნილი მომხმარებლისა და ჯგუფის შესახებ ინფორმაცია /etc/passwd და /etc/group
u.
ფაილებში ინახება.
ო
ed
/etc/passwd-ში თითო ხაზში თითო მომხმარებლის მონაცემებია მოცემული, ისინი და-
თ
ყოფილია ველებად, სვეტებად და ერთმანეთისგან ორწერტილით (:) არის გამოყოფილი. პირ-
შა
ე
ველ ველში წერია მომხმარებლის სახელი, მეორეში მისი პაროლი, მესამეში UID, მეოთხეში
u.
ერ
GID, მეხუთეში დამატებითი ინფორმაცია მომხმარებლის შესახებ - ამ ველის შევსება ნება-
მუ
bt
ყოფლობითია, ის შეიძლება ცარიელი იყოს, მეექვსეში მომხმარებლის პირადი დირექტორიაა
მწ
li@
მე სისტემაში შესვლისას, მეშვიდეში კი ინტერპრეტატორია მოცემული, shell, რომელიც უნდა
მო
sh
ra
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
ეს
შვ
bin:x:2:2:bin:/bin:/usr/sbin/nologin
ba
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
ნი
liz
...
შე
დიდი დაკვირვება არ დაგვჭირდება იმის დასადგენად, რომ ამ ფაილში იმაზე მეტი მომ-
il.
ხმარებელია შექმნილი, ვიდრე ერთი შეხედვით ჩანს. ვნახოთ რა დანიშნულება აქვთ მათ. მომ-
ვთ
ხმარებელი სახელად root სისტემის ადმინისტრატორია და მას ყველაფრის უფლება აქვს. ამის
ch
70
სახელებია, რომლებიც ამ ჯგუფშია გაწევრიანებული.
:
floppy:x:25:achiko
ზე
tape:x:26:
sudo:x:27:
ა
...
სტ
ა!
თუ კარგად დავუკვირდებით /etc/passwd ფაილის შიგთავსს, მეორე სვეტში პაროლის
ო
ნაცვლად x სიმბოლოა ჩაწერილი (ისევე როგორც /etc/group-ში). ეს იმას არ ნიშნავს, რომ
სი
ფ
მომხმარებლის პაროლი x ასო-ნიშანია, არამედ იმას, რომ პაროლები სხვაგან, /etc/shadow
”
ფაილში ინახება. ჯგუფის პაროლების შემთხვევაში - /etc/gshadow-ში.
ge
.
საკუთარი პაროლის შეცვლა ყველა მომხმარებელს შეუძლია, სხვა მომხმარებლების
ელ
ვე
პაროლების შეცვლა კი მხოლოდ root-ის უფლებებითაა შესაძლებელი.
u.
ვნახოთ, როგორ შეგიძლიათ თქვენივე პაროლის შეცვლა. ზოგადად, უსაფრთხოები-
ო
სათვის რეკომენდებულია რეგულარულად ცვალოთ პაროლები.
ed
თ
შა
u.
achiko@debian:∼$ passwd
ერ
მუ
bt
(current) UNIX password:
მწ
სა
vi
დან გამომდინარე. ხომ შეიძლება დროებით დატოვოთ თქვენი სამუშაო გარემო და ამ დროს
sh
სხვა ადამიანმა სცადოს თქვენი პაროლის შეცვლას?) შემდეგ კი ახალი პაროლის დაფიქსირე-
ნე
ბას.
ra
ეს
liz
ვუბრუნდებით.
გთ
71
-l ოფციით დეტალურ ინფორმაციას ვიღებთ ფაილის შესახებ, სადაც ჩვენთვის საინტერესო
ინფორმაციაც არის მოცემულია.
achiko@debian:∼$ ls -l LICENSE.txt
-rw-r--r-- 1 achiko achiko 12767 Oct 10 2017 LICENSE.txt
:
ზე
თუ დირექტორიის შესახებ გვსურს მსგავსი დეტალური ინფორმაციის მიღება, მაშინ -l
ოფციასთან ერთან -d ოფციაც უნდა გამოვიყენოთ. მის გარეშე გაშვებული ბრძანება არა თავად
ა
დირექტორიის, არამედ ამ დირექტორიაში არსებული ფაილებისა და დირექტორიების შესახებ
სტ
მოგვცემს ინფორმაციას.
ა!
ო
achiko@debian:∼$ ls -ld .
სი
drwxr-xr-x 18 achiko achiko 4096 Jun 6 17:50 .
ფ
რ
ge
.
ელ
achiko@debian:∼$ ls -l .
total 84 ვე
u.
drwxr-xr-x 2 achiko achiko 4096 Oct 6 2017 Desktop
ო
ed
drwxr-xr-x 2 achiko achiko 4096 Oct 6 2017 Documents
თ
drwxr-xr-x 2 achiko achiko 4096 Oct 10 2017 Downloads
შა
u.
ერ
...
მუ
bt
მწ
სა
sh
რა უფლებები აქვთ მფლობელის ჯგუფის სხვა წევრებს ამ ფაილზე, ხოლო ბოლო 3 კი ყვე-
ლა სხვა დანარჩენი მომხმარებლების უფლებებს აღნიშნავს. ხაზის მესამე და მეოთხე ველში,
ნე
ra
ba
ნი
მაგალითად: მაგალითად:
ar
72
w გვაქვს როგორც ფაილის შიგთავსის გვაქვს დირექტორიის შიგთავსში
შეცვლის, ასევე დამატების, წაშლის ცვლილების შეტანის უფლება: მასში
და შემდეგ მისი შენახვის უფლება. ფაილის ან დირექტორიის შექმნის,
წაშლის ან სახელის გადარქმევის.
მაგალითად: მაგალითად:
:
ზე
cat file1 > file2 touch directory/file
vi file rm -r dir/{f1,dir1}
ა
x ფაილი აღიქმება, როგორც პროგ- გვაქვს ამ დირექტორიაში გადას-
სტ
რამა და შესაძლებელი ხდება მი- ვლის, მასში შესვლის უფლება.
სი გაშვება. სკრიპტების შემთხვევა-
ა!
ო
ში ფაილს დამატებით კითხვის უფ-
ლება აუცილებლად უნდა ჰქონდეს.
სი
ფ
მაგალითად: მაგალითად:
ge
.
ელ
cat file1 > file2 cd directory/
ვე
u.
ო
ed
ყურადღება!
თ
შა
ე
ფაილის წაშლის უფლება მოიცემა არა თვითონ ფაილის ატრიბუტებით, არამედ იმ დი-
u.
ერ
რექტორიის ატრიბუტებით, რომელშიც ეს ფაილი იმყოფება.
მუ
bt
მწ
სა
li@
მო
vi
უფლება.
არ
sh
ra
ეს
e
il.
ამის გაკეთება chmod ბრძანებით შეგვიძლია. უნდა აღინიშნოს, რომ ფაილებზე უფლე-
ch
შეუძლია. chmod ბრძანება ორი სხვადასხვა სინტაქსური ფორმით იწერება - ციფრული და სიმ-
ar
ბოლური.
გთ
73
ჩვენ, ადამიანებს, გაგვიმართლა და ვცხოვრობთ არა ციფრულ, არამედ ანალოგურ
სამყაროში. აქ, ჩვენ გვაქვს ფერების უსასრულო რაოდენობა, ხმის უსასრულო რაოდენობის
ტონალობა, უსასრულო გრადაცია სურნელსა და გემოში და ა.შ. ასეთ სამყაროში ნებისმიერი
ანალოგური ნიმუში უსასრულო რაოდენობა შესაძლებელი მნიშვნელობების მქონეა. ტერმინი
ანალოგურიც იქიდან მოდის, რომ ჩვენ ნიმუშის რაიმე მახასიათებლის გაზომვისას შესატყვი-
სობას, ანალოგიას ვაკეთებთ.
:
ციფრულ სამყაროში კი ყველაფერს სასრული, დისკრეტული მნიშვნელობა აქვს. ეს
ზე
იმას ნიშნავს, რომ აქ გვაქვს მინიმალური საზომი ერთეული და მასზე პატარის გაზომვა აღარ
შეგვიძლია. ციფრულ სამყაროში ყველაფერი რიცხვებით გამოისახება. სწორედ ამიტომ ვიყე-
ა
ნებთ ტერმინს ციფრული . მაგალითად, ხმა, გამოსახულება თუ ტექსტი კომპიუტერებში გარ-
სტ
”
კვეული მექანიზმით რიცხვებში გარდაიქმნება. შემდეგ ხდება ამ რიცხვების შენახვა, დამუშავ-
დება, გადაცემა, აღდგენა მის თავდაპირველ ვერსიამდე და სხვა.
ა!
ო
ანალოგურსა და ციფრულს შორის განსხვავება ნათლად ჩანს ანალოგური (სურ. 8.1)
და ციფრული საათების (სურ. 8.2) შედარებისას.
სი
ფ
რ
ge
.
ელ
12
11 1
10 2
ვე
u.
9 3
ო
ed
თ
8 4
შა
7 5
6
ე
u.
ერ
მუ
bt
სურ 8.1: ანალოგური საათი სურ 8.2: ციფრული საათი
მწ
სა
li@
ანალოგურ საათში წუთების ისარი ნელ-ნელა, უწყვეტად გადადის. ციფრულში კი წუთე-
მო
sh
შვ
”
იყო. ასეთი გადაყვანისას გარკვეული ინფორმაცია სამუდამოდ იკარგება. ამის თვალსაჩინოდ
ch
სანახავად ავიღოთ ნებისმიერი კადრის ანალოგური (სურ. 8.3) და მისი ციფრული ვერსია.
ხო
ხავთ წერტილების (პიქსელების) ბადეს (სურ. 8.4). რაც უნდა კარგი ხარისხის ფოტოაპარატი
გთ
74
:
ა ზე
სტ
ა!
ო
სი
ფ
რ
ge
.
ელ
სურ 8.3: სრული სურათი სურ 8.4: გადიდებული ფრაგმენტი
ვე
u.
ო
ed
თ
გება. რაც უფრო პატარა ინტერვალში (ანუ, უფრო დიდი სიხშირით) ვიწერთ ხმას, მით უფრო
ხარისხიანი იქნება ჩანაწერი.
შა
u.
თვასაჩინოებისთვის წარმოვიდგინოთ შემდეგი გრაფიკები. ხმა ტალღებით ვრცელდე-
ერ
ბა სამყაროში. მასი აღწერა კი მათემატიკური ფუნქციებით შეგვიძლია. წარმოვიდგინოთ მისი
მუ
bt
გრაფიკი. ანალოგურ ვერსიაში ხმას უწყვეტი ფორმა აქვს (სურ. 8.5). ციფრულში კი ამ ფორმის
მწ
მიახლოვებული ვერსია გვაქვს (სურ. 8.6). რაც მეტია ჩაწერის სიხშირე, მით მეტადაა მიახლო-
სა
li@
ვებული ჩანაწერი ორიგინალ ხმას. (სურ. 8.7)
მო
ის
sh
x x x
ნე
ra
ეს
შვ
სურ 8.5: ბუნებაში არსე- სურ 8.6: ცუდ ხარისხში სურ 8.7: უკეთეს ხა-
ba
liz
შესაბამისი რიცხვი და სად იწყება მეორე, რამდენი რიცხვი შეესაბამება ერთ ასო-ნიშანს და
il.
სხვა. ამ კითხვებზე პასუხი მხოლოდ ჩვენზეა დამოკიდებული. ჩვენი გადასაწყვეტია, როგორ შე-
ვთ
რომ თუ ერთად მუშაობა სურთ, წინასწარ დადგენილი წესით მოხდეს ინფორმაციის წარმოდ-
გთ
გენა ერთი სისტემიდან, ერთი კოდირებიდან მეორეზე გადაყვანა. ერთ-ერთი ასეთი მარტივი
კოდირების სქემაა სწორედ ASCII კოდირება.
ჩვენ, ადმიანები, დათვლას ათობითი სისტემაში ვართ მიჩვეულები.
რას უდრის 8+7 ? თუ თქვენი პასუხია 15, მაშინ ათობით სისტემაში აზროვნებთ. ეს,
ალბათ, იქიდან გამომდინარეობს, რომ დაბადებიდან 10 თითი აქვს ადამიანს და თვლის სწავ-
ლასაც სწორედ თითების დახმარებით იწყებს. 10-ობით სისტემაში, როგორც უკვე ვიცით, სულ
75
10 სხვადასხვა ციფრი არსებობს. ესენია: 0, 1, 2, 3, 4, 5, 6, 7, 8 და 9 და მათი საშუალებით
გამოვსახავთ ყველა დანარჩენ რიცხვებს. ათობითი სისტემა მსოფლიოში ყველაზე გავრცელე-
ბული სისტემაა, თუმცა ძველად ქართველები (და არამარტო ქართველები) თვლისას ოცობით
სისტემას იყენებდნენ. ამას მოწმობს რიცხვების აღმნიშვნელი დღემდე შემორჩენილი ტერმინე-
ბი (ორმოცი, ანუ ორი ოცი), 60 (სამოცი, ანუ სამი ოცი) და 80 (ოთხმოცი, ანუ ოთხი ოცი).
ახლა მოდით, დროებით დავივიწყოთ ათობითი სისტემა, გადავერთოთ ორობით სის-
ტემაზე, ამ სისტემაში დავიწყოთ აზროვნება და რიცხვების თვლა. რადგან აქ სულ ორი ციფრი
:
ზე
გვაქვს: 0 და 1, მათი საშუალებით უნდა გამოვსახოთ ყველა რიცხვი, ასე: 0, 1, 10, 11, 100,
101, 110, 111, 1000 ...
ა
თვლის რვაობით სისტემაში კი სულ 8 ციფრი გვაქვს: 0-დან 7-ის ჩათვლით. ამ სისტე-
სტ
მაში ჩაწერილი რიცხვებია: 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21
...
ა!
ო
თექვსმეტობით თვლის სისტემაში 16 აღმნიშვნელი ასო-ნიშანი გვაქვს 0-დან 9-ის ჩათ-
ვლით და A-დან F-ის ჩათვლით. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12
სი
ფ
...
ვნახოთ, როგორ გამოისახება ათობითი თვლის სისტემის ერთერთი რიცხვი, მაგალი-
ge
.
თად, 12, სხვადასხვა სისტემებში: 1210 11002 C16 148
ელ
ვე
ერთი თვლის სისტემიდან მეორეზე რიცხვების გადაყვანა ჩვენი წიგნის ფარგლებს ცდე-
u.
ბა. ცდებისთვის შეგიძლიათ ონლაინ გადამყვანები გამოიყენოთ. ისინი ინტერნეტში მრავლადაა
წარმოდგენილი.
ო
ed
თ
ორობითი სისტემა გასაგებია, რომ ძალიან მნიშვნელოვანია. კომპიუტერს ხომ თვლის
შა
ე
მხოლოდ ეს სისტემა ესმის და მასში ნებისმიერი ინფორმაცია ორობით კოდში მოიცემა და
u.
ერ
გაიგება. მაშ, რაღაში გვჭირდება რვაობითი და თექვსმეტობითი სისტემები?
მუ
bt
ბობს. ერთ-ერთია ცნობილი RGB ( Red , Green , Blue ) მოდელი. მასში წითელი, მწვანე და
მწ
სა
li@
ლურჯი ფერების სხვადასხვა დოზით შერევით უამრავი კომბინაციის მიღება შეიძლება. კომპი-
მო
vi
გრადაციად დაყოფა შეიძლება. გამოდის, რომ ამ გრადაციების შერევის ყველა შესაძლო კომ-
ბინაციით 2563 =16 777 216 რაოდენობის სხვადასხვა ფერის მიღება შეგვიძლია.
ბი
არ
sh
ნეს კომპიუტერში უფრო კომპაქტურად ჩაწერის სხვა გზები. ხაკისფერი თექვსმეტობით სის-
ba
ტემაში ასე გამოიყრება: C3B091 (აქედან წითელი ფერის კომპონენტია - C3, მწვანესი - B0,
ნი
RBG მოდელის გარდა, ცნობილია CMYK ( Cyan , Magenta , Yellow , Black ) მოდე-
შე
ლი. ის დაფუძნებულია ამ ოთხ ფერზე (ცისფერი, მუქი ვარდისფერი, ყვითელი და შავი) და მას
e
თი თვლის სისტემა, თუმცა რვაობით სისტემასაც აქვს თავისი გამოყენება. უფლებების განსა-
ch
ბებზე შესაბამისობა მოვახდინოთ, ასე: ორობით ჩანაწერში სადაც 1-ია, შესაბამისი ატრიბული
ჩავსვათ, ხოლო სადაც 0-ია ატრიბუტის ნაცვლად ტირე (-). მივიღებთ შემდეგ სქემას:
გთ
0 000 –––
76
1 001 ––x
2 010 –w–
3 011 –wx
4 100 r––
:
ზე
5 101 r–x
6 110 rw–
ა
სტ
7 111 rwx
ა!
ო
ახლა უფრო მარტივად მისახვედრი იქნება თუ როგორ გამოისახება უფლებები ორობი-
სი
თი და რვაობითი სისტემების დახმარებით.
ფ
მოვიყვანოთ რამდენიმე მაგალითი. თუ გვსურს, რომ ფაილის უფლებები შემდეგნაირად
ge
გამოიყურებოდეს - rwxr-xr--, მაშინ chmod ბრძანებას საკმარისია გადავცეთ 764 (7 როგორც
.
ელ
rwx, 6 როგორც rw-, 4 როგორც r--). საბოლოოდ ბრძანება ასეთ სახეს მიიღებს:
ვე
u.
achiko@debian:∼$ chmod 764 file
ო
ed
თ
შა
ე
rw-r----- უფლებების მისაცემად კი შემდეგი ბრძანებაა საჭირო:
u.
ერ
მუ
bt
achiko@debian:∼$ chmod 640 file
მწ
სა
li@
chmod ბრძანება, როგორც ვთქვით, ციფრულის გარდა, სიმბოლურ ჩანაწერსაც იგებს.
მო
vi
ვანიჭებთ.
ბი
არ
sh
ატრიბუტი მნიშვნელობა
ნე
ra
ეს
ba
a
მომხმარებელს.
e
il.
ვთ
ch
ხო
ar
77
achiko@debian:∼$ chmod u+x filename
achiko@debian:∼$ chmod u+r,g-x filename
achiko@debian:∼$ chmod u+rw,go=rx filename
achiko@debian:∼$ chmod +r filename
:
ზე
8.3 სპეციალური ატრიბუტები
ა
კითხვის, ჩაწერისა და შესრულების უფლებების გარდა, shell-ში კიდევ სამი სპეციალუ-
სტ
რი უფლება არსებობს. ესენია:
ა!
SUID (Set User IDentification)
ო
SGID (Set Group IDentification)
სი
ფ
Sticky bit
ge
.
ელ
ჩვენ ზემოთ აღვნიშნეთ, რომ მომხმარებელს უფლება აქვს თავისი პაროლი შეცვალოს.
ვე
u.
ვთქვით ისიც, რომ ეს პაროლები /etc/shadow-ში ინახება (დაშიფრული სახით). გამოდის, რომ
მომხმარებელს ცვლილების შეტანის უფლება ჰქონია ამ ფაილში.
ო
ed
თ
გადავამოწმოთ და დეტალურად ვნახოთ, ვის რა უფლება აქვს ამ ფაილზე:
შა
u.
ერ
achiko@debian:∼$ ls -l /etc/shadow
მუ
bt
-rw-r----- 1 root shadow 8598 oct. 27 2017 /etc/shadow
მწ
სა
li@
/etc/shadow, როგორც ჩანს, ეკუთვნის root-ს. ადმინისტრატორია ამ ფაილის მფლო-
მო
ბელი და მხოლოდ მას აქვს ამ ფაილის შიგთავსის შეცვლის უფლება. ჰმმმ... საინტერესოა, მაშ
ის
”
sh
ra
გამოიყენება.
ეს
შვ
ba
/usr/bin/passwd
liz
შე
achiko@debian:∼$ ls -l /usr/bin/passwd
il.
ვთ
78
achiko@debian:∼$ chmod u+s program file
:
ზე
მინიჭების შემდეგ, ls -l ბრძანების შედეგში მფლობელის გაშვების უფლება ანუ x ატ-
ა
რიბუტი, პატარა s-ად გადაკეთდება. ხოლო თუკი x ატრიბუტი მანამდე მინიჭებული არ ჰქონდა
სტ
program file-ს, მაშინ დიდ S-ად.
SUID ბიტის მოხსნა შეიძლება ასე:
ა!
ო
სი
ფ
achiko@debian:∼$ chmod u-s program file
ge
.
SGID უფლება SUID -ის მსგავსია. განსხვავება ისაა, რომ როდესაც SGID გააქტიურე-
ელ
ვე
ბული აქვს ბრძანებას, მის გაშვებას უკვე ამ ბრძანების ჯგუფის უფლებებით ვახდენთ. SGID
u.
ბიტის მინიჭება/მოხსნა იდენტურად ხდება.
ო
ed
თ
achiko@debian:∼$ chmod g+s program file
შა
u.
achiko@debian:∼$ chmod g-s program file
ერ
მუ
bt
ციფრული მეთოდით მინიჭება კი ასე ხდება:
მწ
სა
li@
მო
vi
sh
თულია, მაშინ ამ დირექტორიაში შექმნილი ფაილები მიეკუთვნებიან იმავე ჯგუფს, რასაც ეკუთ-
ra
შვ
liz
e
il.
ვთ
როგორიცაა /tmp. მასში ყველა მომხმარებელს შეუძლია შექმნას ფაილები, მაგრამ მათი წაშლა
გთ
79
achiko@debian:∼$ chmod +t directory/
:
ან ციფრული მეთოდით ასე:
ზე ა
achiko@debian:∼$ chmod 1777 directory/
სტ
ა!
ო
სი
ფ
რ
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
80
თავი 9
:
ა ზე
პროცესები
სტ
ა!
ო
სი
ფ
ანამედროვე ოპერაციული სისტემები მრავალმომხმარებლიანის გარდა, მრავალამო-
ge
.
ელ
შესრულება შეუძლია. პროგრამა არის კომპიუტერისთვის გასაგები ინსტრუქციების
ვე
ერთობლიობა და ის ინახება მუდმივ დამამახსოვრებელ მეხსიერებაში, მყარ დისკზე.
u.
მისი შესრულებისას ეს ინსტრუქციები იკითხება მყარი დისკიდან და კოპირდება ოპერატიულ
ო
ed
მეხსიერებაში. პროგრამის ასეთ გაშვებულ ფორმას პროცესი ჰქვია. მომხმარებლების მიერ გაშ-
თ
ვებული პროცესების გარდა, მეხსიერებაში ბევრი პროცესი თავად სისტემის მიერაა გაშვებული
შა
u.
ერ
vi ბრძანების გაშვება, მაგალითად, გამოიწვევს ერთი პროცესის შექმნას. მაგრამ თუ
მუ
bt
vi ბრძანება სისტემაში შემოსულმა 8 მომხმარებელმა გაუშვა, მაშინ 8 სხვადასხვა პროცესი
მწ
იარსებებს მეხსიერებაში.
სა
li@
პროცესი იდენტიფიცირდება უნიკალური ნომრით, პროცესის იდენტიფიკატორით (Proc-
მო
ess ID), მოკლედ PID. არცერთ სხვა პროცესს არ შეუძლია ამ ნომრის - PID-ის მიღება, სანამ
ის
გარკვეული მომხმარებელი და ჯგუფი ასოცირდება: ვინ გაუშვა ეს პროცესი, ვინაა მისი მფლო-
ნე
მარტივი პროგრამის გაშვებისას, როგორც წესი, მისი შესაბამისი ერთი პროცესი იქ-
liz
შექმნას მეხსიერებაში.
e
პროცესის გაშვება ორი გზით არის შესაძლებელი - წინა და უკანა პლანზე გაშვებით.
il.
ვთ
81
სერვისები, ეშვება. ისინი სისტემას ფუნქციონირებაში ეხმარებიან.
პროცესები ერთმანეთისგან სრულიად დამოუკიდებელი არ არის. როდესაც პროცესი
იქმნება, ის ინარჩუნებს კავშირს თავის მშობელ პროცესთან, რომლის იდენტიფიკატორი აღი-
ნიშნება PPID-ით (Parent PID). თავის მხრივ, ეს უკანასკნელიც თავის მშობელთანაა მიბმული
და საბოლოოდ დავდივართ პირველ პროცესამდე, რომელისგანაც ყველა დანარჩენი პროცესი
დაიწყო. პირველი პროცესი არის systemd, ძველ სისტემებში - init და მისი PID არის ნომერი
:
1. ასე ქმნიან პროცესები ხისებრ სტრუქტურას, რომლის ძირიც არის systemd/init.
ზე
პროცესების სანახავად ყველაზე ხშირად ps ბრძანებას ვიყენებთ. მას უამრავი ოფცია
ესმის, თუმცა მარტივად მათ გარეშეც ეშვება, ასე.
ა
სტ
achiko@debian:∼$ ps
ა!
PID TTY TIME CMD
ო
916 pts/0 00:00:00 bash
სი
ფ
934 pts/0 00:00:00 ps
ge
.
ელ
შედეგად, თქვენც ორ პროცესს დაინახავთ, bash და ps შესაბამისი 916 და 934 PID-
ვე
ებით. TTY სვეტში მოცემულია საკონტროლო ტერმინალის სახელი, ანუ რომელი ტერმინალი-
u.
დან იქნა გაშვებული ეს ბრძანებები (გრაფიკულ გარემოში ტერმინალის ემულატორებით გაშვე-
ო
ed
ბული ტექსტის შეტან/გამოტანის გარემოს პსევდოტერმინალს უწოდებენ და აღნიშნავენ pts-ით
თ
(pseudo-ttys), ხოლო გრაფიკული გარემოს უკან გაშვებული ტერმინალი კი tty-თი აღინიშნე-
შა
ე
ბა), TIME ველში კი მოცემულია ის დრო, რა დროც დაჭირდა პროცესორს (CPU) ამ პროცესის
u.
ერ
შესასრულებლად ჩვენი მაგალითის შემთხვევაში. როგორც ჩანს, დიდი დატვირთვა არ გამოუწ-
მუ
bt
მწ
li@
სიზუსტით), ამ პროცესებს გასაშვებად პროცესორის დროის ერთი წამიც კი არ დასჭირდა. ოფ-
მო
sh
achiko@debian:∼$ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
ნე
ra
achiko 897 0.0 0.4 20968 4800 tty1 S+ 14:11 0:00 -bash
ეს
achiko 916 0.0 0.5 20980 5148 pts/0 Ss 14:12 0:00 -bash
შვ
liz
დამატებით გამოჩნდა ის, რომ მომხმარებელ achiko-ს გაუხსნია bash (achiko-ს მიერ
შე
u . აგრეთვე, ჩანს, თუ როდის გაუშვა achiko-მ ეს ბრძანებები (START), მათ გაშვებას რა რე-
სურსები დაჭირდა: რამდენად დატვირთა პროცესორი (%CPU), ოპერატიულ მეხსიერების რა
il.
ვთ
ტულ მომენტში (კილობაიტებში) (RSS – residentset size). VSZ (virtual set size) კი გვანახებს
ხო
ვი ბოროტი სულიერი ქმნილებაა. სწორედ ამიტომ Daemon ფორმულირებული იქნა როგორც Disk And Execution
გთ
”
MONitor აკრონიმი, თუმცა ეს შემდგომი ჩანაფიქრი იყო.
2
პროცესორის დრო* (CPU time) - CPU (Central processing unit) time ან process time დროის ის ოდენობაა, რასაც
CPU ხარჯავს პროგრამის დასამუშავებლად. ის იზომება წამებში ან ტაქტებში/ციკლებში (clock ticks). ტაქტი/ციკლი/ძ-
გერა ყველაზე პატარა ერთეულია დროს გამოსახატად კომპიუტერებში. ის პირობითი სიდიდეა და დაკავშირებულია
მისი საათის მუშაობასთან. მისი სიჩქარე დამოკიდებულია სისტემაზე და იზომება ჰერცებში. მაგალითად, თუ მისი სიჩ-
ქარე 2 GHz-ია, ეს ნიშნავს, რომ 1 წამში 2 მილიარდი ტაქტი, ციკლი, ძგერა ხდება. CPU კი ინსტრუქციებს ტაქტებში
ასრულებს.
82
მდგომარეობა მოიცემა და ის სხვადასხვა ასო-ნიშნით აღინიშნება:
პროცესის მდგომარეობები
:
ზე
Z ზომბი პროცესი. ის აღარაფერზე რეაგირებს (პროცესი დამთავრდა, თუმცა მამა პრო-
ცესის მიერ ვერ გაიწმინდა მეხსიერებიდან. როგორც წესი, ასეთი შემთხვევები ცუდად
ა
დაწერილ პროგრამების გაშვებისას გხვდება).
სტ
< მაღალ პრიორიტეტულ პროცესს აღნიშნავს, ანუ უფრო მეტი CPU დრო იხარჯება მის
ა!
შესრულებაზე.
ო
N დაბალ პრიორიტეტული.
სი
ფ
+ წინა პლანზე არსებული პროცესი.
ge
.
ელ
s სესიის ლიდერი, კონკრეტულ სესიაში წამყვანი პროცესი.
ვე
u.
ო
ed
თ
შა
u.
რომ ვნახოთ, მაშინ უნდა გავუშვათ: ps x ან ps xu.
ერ
მუ
bt
achiko@debian:∼$ ps x
მწ
სა
li@
PID TTY STAT TIME COMMAND
891 ? Ss 0:00 /lib/systemd/systemd --user
მო
vi
sh
შვ
ბევრი პროცესი არა ტერმინალზე მიბმული, არამედ უკანა პლანზე, ფონურადაა გაშვე-
ba
ბული სისტემის სხვადასხვა მომხმარებლის მიერ. მათ სანახავად a ოფცია უნდა გამოვიყენოთ.
ნი
achiko@debian:∼$ ps aux
il.
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
ვთ
83
ალბათ, შეამჩნევდით, რომ ps ბრძანებას ოფციები ტირე-ს გარეშე მივუთითეთ. ეს BSD
სისტემებში გავრცელებული ოფციების ტიპია და ps ბრძანებას ისინი ჩვენთვის უკვე ნაცნობ
Unix3 და GNU4 ოფციების ტიპთან ერთად კარგად ესმის.
ყველა პროცესის ნახვა ტრადიციული - Unix-ის სტილით ასე მოიცემა:
achiko@debian:∼$ ps -e
:
PID TTY TIME CMD
ზე
1 ? 00:00:00 systemd
2 ? 00:00:00 kthreadd
ა
სტ
3 ? 00:00:00 ksoftirqd/0
...
ა!
ო
ან
სი
ფ
რ
ge
achiko@debian:∼$ ps -ef
.
ელ
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:11 ?
ვე
00:00:00 /sbin/init
u.
root 2 0 0 14:11 ? 00:00:00 [kthreadd]
ო
ed
root 3 2 0 14:11 ? 00:00:00 [ksoftirqd
თ
...
შა
u.
ერ
მუ
bt
მწ
სა
li@
achiko@debian:∼$ ps axjf
PPID PID PGID ... STAT UID TIME COMMAND
მო
...
ის
vi
sh
...
ba
ნი
ან ასე:
liz
შე
achiko@debian:∼$ ps -ejH
e
...
ch
3
Unix ოფციების ტიპი მოიცემა ერთი ტირეთი. მაგალითად, -a
4
GNU ოფციების ტიპი მოიცემა სიტყვებით და ორი ტირეთი. მაგალითად, --all
84
ასეთი ფორმით უკეთ დავინახავთ ვინაა ამა თუ იმ პროცესის მამა თუ შვილი პროცესი.
ხისებრი სტრუქტურის ნახვა შეგვიძლია აგრეთვე pstree ბრძანებით.
achiko@debian:∼$ pstree
systemd-+-ModemManager-+-{gdbus}
| `-{gmain}
:
|-NetworkManager-+-{gdbus}
ზე
| `-{gmain}
|-VGAuthService
ა
|-anacron
სტ
|-atd
|-avahi-daemon---avahi-daemon
ა!
ო
|-cron
სი
ფ
|-dbus-daemon
|-dhclient
ge
.
|-login---bash---watch
ელ
|-minissdpd
ვე
u.
|-polkitd-+-{gdbus}
| `-{gmain}
ო
ed
თ
|-rsyslogd-+-{in:imklog}
შა
| |-{in:imuxsock}
ე
u.
| `-{rs:main Q:Reg}
ერ
მუ
|-sshd-+-sshd---sshd---bash
bt
| `-sshd---sshd---bash---pstree
მწ
...
სა
li@
მო
sh
1 ? 00:00:00 systemd
შვ
2 ? 00:00:00 kthreadd
ba
3 ? 00:00:00 ksoftirqd/0
ნი
...
liz
შე
e
il.
ოფციები მნიშვნელობა
ვთ
ch
SUID ატრიბუტი).
85
achiko@debian:∼$ ps aux --sort -pcpu
:
ზე
ასევე შეგვიძლია ჩვენთვის სასურველი ფორმატით გამოვიტანოთ ეკრანზე პროცესების
ა
შესახებ ინფორმაცია -o ოფციის საშუალებით, მაგალითად ასე:
სტ
achiko@debian:∼$ ps -eo pid,user,vsz,rss,comm
ა!
ო
PID USER VSZ RSS COMMAND
სი
ფ
1 root 138892 6752 systemd
2 root 0 0 kthreadd
ge
3 root 0 0 ksoftirqd/0
.
ელ
...
ვე
u.
შეგვიძლია თან დავახარისხოთ:
ო
ed
თ
შა
ე
achiko@debian:∼$ ps -eo pid,user,vsz,rss,comm --sort=-rss
u.
ერ
PID USER VSZ RSS COMMAND
მუ
bt
423 root 153488 18160 VGAuthService
მწ
li@
273 root 49784 7296 systemd-udevd
მო
...
vi
ბი
არ
sh
შვ
ხებ, თუმცა ეს მხოლოდ მყისიერი, ps-ის გაშვების მომენტში არსებული სურათია. დინამიკურ
ნი
რეჟიმში პროცესების ნახვა top ბრძანებით შეგვიძლია. ის უწყვეტ რეჟიმში (ნაგულისხმევი მნიშ-
liz
achiko@debian:∼$ top
il.
ვთ
top - 14:34:44 up 1 day, 3:31, 3 users, load average: 0.14, 0.06, 0.01
Tasks: 166 total, 1 running, 165 sleeping, 0 stopped, 0 zombie
ch
%Cpu(s): 5.5 us, 1.7 sy, 0.0 ni, 92.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0
ხო
KiB Mem : 2033708 total, 808168 free, 563852 used, 661688 buff/cache
ar
KiB Swap: 1046524 total, 1046524 free, 0 used. 1284724 avail Mem
გთ
86
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworke+
7 root 20 0 0 0 0 S 0.0 0.0 0:03.13 rcu_sc+
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root rt 0 0 0 0 S 0.0 0.0 0:00.13 migrat+
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-ad+
11 root rt 0 0 0 0 S 0.0 0.0 0:00.25 watchd+
:
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
ზე
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
14 root rt 0 0 0 0 S 0.0 0.0 0:00.23 watchd+
ა
...
სტ
ა!
მოდით, გავარჩიოთ თუ რა ინფორმაცია გამოიტანა ამ ბრძანებამ:
ო
სი
ფ
ა) მიმდინარე დრო.
ბ) uptime - დრო, რაც სისტემის ჩართვის/გაშვების შემდეგაა გასული.
ge
.
ელ
გ) სისტემაში შემოსული მომხმარებლების რაოდენობა.
ვე
u.
დ) პროცესორის საშუალო დატვირთვა ბოლო 1, 5 და 15 წუთის განმავლობაში.
ე) პროცესების სხვადასხვა ჯამური რაოდენობები.
ო
ed
თ
ვ) პროცესორის დროის დეტალური განაწილება: მომხმარებლების მიერ დახარჯული დრო,
შა
u.
სისტემის მიერ დახარჯული დრო, შეცვლილი პრიორიტეტით გაშვებული ამოცანებისთვის
ერ
დახარჯული დრო და ა.შ.
მუ
bt
ზ) ოპერატიული მეხსიერებისა და ვირტუალური მეხსიერების დეტალური განაწილება: სრუ-
მწ
სა
vi
ბი
top ბრძანების საწყისი ნაწილი, თავსართი, სამი სხვა დამოუკიდებელი ბრძანების სა-
არ
sh
ra
uptime
ეს
შვ
top პროგრამას რამდენიმე შიდა ბრძანება აქვს და მათი გაშვება კლავიატურიდან სხვა-
e
მიხედვით.
ch
ar
87
PID-ის დასახელებით დირექტორიას და სწორედ მასში ინახება პროცესის შესახებ დეტალური
ინფორმაცია.
:
ზე
მძლავრი, თანამედროვე პროცესორები ხშირად L1 cache-ის მსგავსად, პროცესორის
შიგნითვე ათავსებენ ასეთ CPU L2 და L3 cache-ს), ბუფერი კი უფრო ნელი - დინამი-
ა
კური მეხსიერების (DRAM) ნაწილია. DRAM - ოპერტიული მეხსიერებაა (მაგალითად,
სტ
DDR3-ც DRAM-ია).
ა!
ო
ბუფერი ძირითადად გამოიყენება პროცესებს შორის მონაცემების შეტან/გამოტანის-
თვის. ამ დროს პროცესორი შედარებით ნაკლებად იტვირთება. კეშში, სწრაფი წვდომის
სი
ფ
მიზნით, ხშირად გამოყენებული მონაცემების ასლი კეთდება.
ge
.
კეში შესაძლებელია იყოს მყარი დისკის ნაწილიც. ბუფერი კი მხოლოდ ოპერატიული
ელ
მეხსიერების ნაწილია.
ვე
u.
კლავიატურიდან წვდომა გვაქვს მხოლოდ ბუფერში არსებულ მონაცემებზე (მაგა-
ო
ed
თ
ლითად, ტექსტის რედაქტირებისას მონიშნული ნაწილის კოპირება და ჩასმა ხდება
შა
ე
ბუფერში და ბუფერიდან), კეშში შენახულ მონაცემებზე - არა.
u.
ერ
მუ
კეშის გარდა, პროცესორში არის უფრო სწრაფი წვდომის დროებით შესანახი ადგილი -
bt
რეგისტრი. რაც უფრო მეტია რეგისტრთა რაოდენობა, მით უფრო მძლავრია პროცესო-
მწ
სა
li@
რი.
მო
ის
vi
ბი
არ
sh
ra
ეს
ლიათ გავუშვათ გრაფიკული პროგრამები - მაგალითად, xlogo (ის X window სისტემის ლოგოს
ba
liz
შე
achiko@debian:∼$ xclock
e
il.
ვთ
გაშვების შემდეგ საათი გამოვა პატარა ფანჯარაში, თუმცა ტერმინალში სხვა ბრძანების
აკრეფის საშუალება აღარ გვაქვს. ბრძანების ასაკრეფი ველი, ე.წ. shell-ის მოსაწვევი აღარ
ch
ჩანს და ეს მანამ გაგრძელდება, სანამ xclock პროგრამას არ დავხურავთ. სხვა სიტყვებით რომ
ხო
წყვეტთ პროგრამის მუშაობას, ფანჯარა გაქრება და shell-ის მოწვევაც გამოჩნდება. ახლა შეგ-
ვიძლია გავუშვათ სხვა ბრძანებები. ამ ხერხით shell-ში ბევრი ბრძანების გათიშვა შეგვიძლია.
თუ გვსურს, რომ პროგრამა გავუშვათ და თან ამასობაში სხვა ბრძანებების აკრეფის
საშუალება გვქონდეს, მაშინ ეს ბრძანება უკანა პლანზე უნდა გადავწიოთ. ამისთვის ბრძანებას
ბოლოში & ოპერატორი უნდა მივუწეროთ და ისე გავუშვათ.
88
achiko@debian:∼$ xclock &
[1] 5821
xclock გაეშვა უკან პლანზე, ეკრანზე დამატებით მისი პროცესის PID დაიწერა. გავუშ-
ვათ, ps ბრძანება და დავრწმუნდეთ, რომ ჩვენი პროცესი გაშვებულია.
:
ზე
achiko@debian:∼$ xclock &
[1] 5821
ა
achiko@debian:∼$ ps
სტ
PID TTY TIME CMD
5812 pts/0 00:00:00 bash
ა!
ო
5821 pts/0 00:00:02 xclock
სი
ფ
6181 pts/0 00:00:00 ps
ge
.
Shell-ში ბრძანება jobs საშუალებით შეგვიძლია მოცემული ტერმინალიდან უკანა
ელ
პლანზე გაშვებული ბრძანებების სია ვნახოთ.
ვე
u.
ო
ed
achiko@debian:∼$ jobs
თ
[1]+ Running xclock &
შა
u.
ერ
მუ
bt
მწ
სა
li@
achiko@debian:∼$ xlogo &
მო
vi
ორი ახალი ფანჯარა გამოვიდა: ერთში ლოგო, მეორეში კი ტექსტის აკრეფა შეგვიძლია.
ბი
არ
sh
ra
ეს
achiko@debian:∼$ jobs
შვ
პლანზე გადმოტანა.
ch
ხო
achiko@debian:∼$ fg %3
ar
გთ
ასე წინა პლანზე გადმოვიდა უკანა პლანზე გაშვებული მესამე ბრძანება, ჩვენს შემთხვე-
ვაში - gedit. მოდით, ახლა, Ctrl^c კლავიშების კომბინაციის ნაცვლად, Ctrl^z კლავიშების
კომბინაციას დავაჭიროთ. ამ დროს gedit-ის პროცესი დაპაუზდება და ასეთ მდგომარეობაში
გადავა უკანა პლანზე. გავაგრძელოთ gedit-ის ფანჯარაში ტექსტის აკრეფა... აღარაფერი იკ-
რიფება. ჩანს, რომ პროცესი მართლაც შეჩერებულია.
89
bg ბრძანებით შეგვიძლია უკანა პლანზე გადასმული დაპაუზებული ბრძანება გავაგრძე-
ლოთ ასე:
achiko@debian:∼$ bg %3
:
ზე
გრაფიკული პროგრამების ბრძანებათა ხაზიდან გაშვება იმ დროსაა სასარგებლო, რო-
ა
დესაც პროგრამა გრაფიკულად არ ეშვება, ან ეშვება ხარვეზებით. ტერმინალში მისი გაშვება
სტ
შეცდომების შეტყობინებების ნახვის საშუალებას მოგცემთ. ამასთან, ბევრ გრაფიკულ პროგ-
რამას ბრძანებათა ხაზიდან გაშვების ბევრი საინტერესო და სასარგებლო ოფცია აქვს.
ა!
ო
სი
ფ
როგორც ზემოთ ვნახეთ, პროცესები ქმნიან ხესებრ სტრუქტურას. ეს იმას ნიშნავს,
რომ თუ რომელიმე პროცესი დასრულდება, მისი მემკვიდრე პროცესებიც ავტომატურად მოკ-
ge
ვდება. მაგალითად ტერმინალიდან გაშვებული პროცესები ტერმინალის დახურვის ან ზოგადად
.
ელ
სამუშაო სესიიდან გამოსვლის შემთხვევაში, ავტომატურად გაითიშება. ხშირია შემთხვევები,
ვე
როდესაც მომხმარებელს ისეთი ამოცანის გაშვება სურს, რომლის შესრულებაც წინასწარ არ
u.
იცის რა დროს გასტანს. ასეთ შემთხვევაში, სასურველია, ეს ბრძანება ისე გავუშვათ, რომ ტერ-
ო
ed
მინალის ან სამუშაო გარემოს დახურვის შემთხვევაში, მაინც გაგრძელდეს და არ გაითიშოს.
თ
სწორედ ამ დროს გამოიყენება ბრძანება disown. ის საშუალებას იძლევა, რომ ტერმინალიდან
შა
u.
ერ
მუ
bt
მოდით, პატარა ცდა ჩავატაროთ. გავუშვათ ტერმინალიდან ერთ-ერთი ბრძანება უკანა
მწ
li@
მო
vi
achiko@debian:∼$ exit
ბი
არ
sh
ra
ეს
შვ
achiko@debian:∼$ exit
ნი
liz
ასეთია:
ch
ხო
90
9.2 სიგნალები
:
ზე
achiko@debian:∼$ kill [-signal] PID
ა
სტ
სიგნალი შეიძლება მოიცეს მისი სახელით ან ნომრით.
ა!
ო
№ სახელი მნიშვნელობა
სი
ფ
1 HUP ან ტრადიციულად, ეს სიგნალი პროცესს ასრულებს. ის აგრეთვე გამოიყე-
SIGHUP ნება ბევრი დემონის მიერ პროცესის რეინიციალიზაციისათვის, ანუ ამ
ge
.
სიგნალის მიღების შემდეგ დემონი გადაიტვირთება (გამოირთვება და ხე-
ელ
ვე
ლახლა ჩაირთვება). შესაბამისად, ხელახლა წაიკითხავს კონფიგურაციის
u.
ფაილს.
ო
ed
თ
2 INT ან შეწყვეტა. იგივეა, რაც კლავიატურიდან გადაცემული Ctrl^c კლავიშე-
შა
u.
ერ
15 TERM ან დამთავრება. ესაა kill ბრძანებაში ნაგულისხმევი მნიშვნელობა, თუ სიგ-
მუ
bt
მწ
li@
SIGKILLT დასრულების სხვა სიგნალებზე არ რეაგირებს. ამ სიგნალის გადაცემით
მო
ხება.
vi
ბი
არ
ra
SIGCONT
შვ
ba
[4] 8526
ხო
ან ასე:
91
achiko@debian:∼$ kill -SIGTERM 8526
:
achiko@debian:∼$ kill 8526
ზე
kill ბრძანებას შეუძლია არგუმენტად რამდენიმე PID მიიღოს. შესაბამისად, შესაძლე-
ა
სტ
ბელია რამდენიმე პროცესის ერთდროულად დასრულება
ა!
ო
achiko@debian:∼$ ps aux | less #ჯერ ვნახულობთ PID-ებს
achiko@debian:∼$ kill PID1 PID2 PID3 ...
სი
ფ
რ
ge
.
შეგვიძლია პროცესი არა მისი PID ის მითითებით, არამედ სახელით დავასრულოთ.
ელ
ამისთვის killall ბრძანება დაგვჭირდება. თუმცა ამ შემთხვევაში, ამ დასახელების ყველა
ვე
u.
პროცესი დასრულდება. მაგალითად, გავუშვათ xclock რამდენჯერმდე. რამდენიმე პროცესი
შეიქმნება. killall-ით ერთბაშად შეიძლება მათზე სიგნალის გადაცემა და ამ შემთხვევაში
ო
ed
თ
xclock-ის ყველა პროცესი დასრულდება.
შა
u.
ერ
achiko@debian:∼$ xclock &
მუ
bt
achiko@debian:∼$ xclock &
მწ
li@
achiko@debian:∼$ killall xclock
მო
sh
ba
ნი
ar
92
achiko@debian:∼$ xkill
achiko@debian:∼$ killall xclock
Select the window whose client you wish to kill with button 1.
:
ა ზე
სტ
9.3 პროცესის პრიორიტეტები
ა!
ო
გაშვებულ პროცესებს, როგორც ვიცით, პროცესორი ასრულებს. პროცესორის რესურ-
სები ყველა გაშვებულ პროცესზე თანაბრად გადანაწილდება. თუმცა, შესაძლებელია პროცესის
სი
ფ
სხვადასხვა პრიორიტეტით გაშვება, ისე რომ სისტემამ მის შესრულებას უფრო მეტი ან ნაკლე-
ბი რესურსი დაუთმოს. პრიორიტეტი, ე.წ. nice მნიშვნელობა, [-20,19] ინტერვალში მოიცემა.
ge
.
ელ
ყველაზე მეტი რესურსი -20 მნიშვნელობით აღინიშნება, 19 კი ყველაზე დაბალი პრიორიტე-
ვე
ტია. პრიორიტეტის მითითების გარეშე, ნაგულისხმევი მნიშვნელობით, ეს მნიშვნელობა 0-ის
u.
ტოლია. პროცესებზე პრიორიტეტების მინიჭებისას უნდა ვიცოდეთ შემდეგი:
ო
ed
თ
შა
u.
ერ
მოყენება 0-დან 19-ის ჩათვლით.
მუ
bt
მწ
li@
5, მას 2-მდე ვერ დაიყვანთ, არ გექნებათ ამის უფლება.
მო
sh
ნე
ვლა შეგიძლიათ.
ba
ნი
liz
[1] 9988
e
il.
ch
ხო
achiko@debian:∼$ top
ar
...
მართლაც, NI ველის მნიშვნელობა 5 გახდა, ხოლო PR ველის
გთ
93
achiko@debian:∼$ renice -n 11 -p 9988
9988 (process ID) old priority 5, new priority 11
:
achiko@debian:∼$ renice -n 5 -p 9988
ზე
renice: failed to set priority for 9988 (process ID):
Permission denied
ა
სტ
nice და renice ბრძანებებს შესაძლებელია გადავცეთ პრიორიტეტის აღმნიშვნელი
ა!
რიცხვი მოკლედ, -n ოფციის გარეშეც, ასე:
ო
სი
ფ
achiko@debian:∼$ nice -5 gedit & ### ეს ბრანება იგივეა, რაც
ge
achiko@debian:∼$ nice -n 5 gedit &
.
ელ
ვე
u.
achiko@debian:∼$ nice --5 gedit & ### ეს ბრანება იგივეა, რაც
ო
ed
თ
achiko@debian:∼$ nice -n -5 gedit &
შა
u.
ერ
მუ
bt
achiko@debian:∼$ renice -n -5 -p 9988
მწ
სა
li@
მო
ის
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
94
თავი 10
:
ა ზე
გარემო, ცვლადები
სტ
ა!
ო
სი
ფ
ყ
ოველ ჯერზე, როდესაც shell-ის სესია იხსნება, იქმნება shell-ის გარემო (environ-
ge
nement). ამ გარემოში თავმოყრილია მნიშნელოვანი მონაცემები shell-დან გასაშვები
.
ელ
ბრძანებებისთვის. ეს მონაცემები, თავის მხრივ, გადანაწილებულია ცვლადებში მათ მნიშ-
ვე
ვნელობებად და სწორედ ეს მნიშვნელობები განსაზღვრავენ shell-დან გაშვებული პროგ-
u.
რამების ქცევას. ამ ცვლადებს გარემოს ცვლადები ჰქვიათ და ისინი ხელმისაწვდომია როგორც
ო
ed
თ
shell-ის პროცესებისთვის, ასევე მათი შვილი პროცესებისთვის. სხვაგვარად რომ ვთქვათ, გა-
რემოს ცვლადებში ამ გარემოშივე გაშვებული პროცესების პარამეტრები (ე.წ. settings) ინახება.
შა
u.
შეთანხმებისამებრ, გარემოს ცვლადებს დიდი ასოებით აღნიშნავენ.
ერ
მუ
bt
ცვლადები მხოლოდ მიმდინარე სესიაში არსებობს და მათი მნიშვნელობები არ არის ხელმი-
მწ
სა
ყველა ცვლადი ლოკალურია. ის გარემოს ცვლადად რომ გაქციოთ, ჯერ უნდა დავაექსპორტოთ,
ის
sh
ra
შვ
ხელი უნდა ვიცოდეთ. მისი მნიშვნელობა შეიძლება იყოს ნებისმიერი სახის: რიცხვი, ტექსტი,
liz
ფაილის სახელი ან სხვა. ანუ ცვლადი სხვა არაფერია, თუ არა მიმთითებელი გარკვეულ მო-
შე
თუმცა ეს ცვლადები მხოლოდ დროებითია და ისინი ავტომატურად წაიშლება მას შემდეგ, რაც
il.
achiko@debian:∼$ Var="value"
სადაც, Var ცვლადის სახელია, ხოლო value მისი მნიშვნელობა. სხვაგვარად რომ
ვთქვათ, ამ ბრძანებით Var ცვლადს ჩვენ მივანიჭეთ value მნიშვნელობა. მინიჭების დროს შელ-
ში გამოტოვება არ უნდა გამოვიყენოთ.
95
achiko@debian:∼$ Var = "value"
-bash: Var : command not found
შედეგი ლოგიკურია, რადგან ასე შელმა Var აღიქვა ბრძანებად, ხოლო მინიჭების ოპე-
რატორი = კი მის პირველ არგუმენტად. Var დასახელების ბრძანება არ არსებობს და შეცდო-
”
მაც ამიტომ გამოვიდა ეკრანზე.
:
ზე
ლოკალური ცვლადი გარემოს ცვლადად რომ გადავაქციოთ, შექმნის შემდეგ ის გარე-
ა
მოში უნდა დავაექსპორტოთ export ბრძანებით, ასე:
სტ
ა!
ო
achiko@debian:∼$ export Var
სი
ფ
ან პირდაპირ, შექმნისთანავე გავაკეთოთ, ასე:
ge
.
ელ
achiko@debian:∼$ export Var="value"
ვე
u.
ო
ed
თ
ცვლადის მნიშვნელობის სანახავად echo ბრძანება გამოიყენება და ცვლადის სახელს
შა
u.
ერ
მუ
bt
achiko@debian:∼$ echo $Var
მწ
value
სა
li@
მო
sh
next value
ეს
შვ
ba
liz
შე
achiko@debian:∼$ printenv
ar
...
გთ
SHELL=/bin/bash
LANGUAGE=en_US:en
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
...
96
achiko@debian:∼$ env
...
SHELL=/bin/bash
LANGUAGE=en_US:en
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
...
:
ზე
ორივე ბრძანება ერთსა და იმავე შედეგს მოგვცემს. ზოგადად, მათ შორის განსხვა-
ა
ვება ისაა, რომ printenv ბრძანებით სრული ჩამონათვალის ნაცვლად კონკრეტული ცვლადი
სტ
შეგვიძლია ვნახოთ:
ა!
ო
achiko@debian:∼$ printenv SHELL
სი
/bin/bash
ფ
რ
ge
.
მეორეს მხრივ, env საშუალებას გვაძლევს გავუშვათ კონკრეტული პროგრამა განსხვა-
ელ
ვე
ვებულ გარემოში ანუ გარემოს ცვლადის განსხვავებული მნიშვნელობით. ამგვარად, cmd ბრძა-
u.
ნება გაეშვება Var-ის შეცვლილი მნიშვნელობით, ხოლო გარემოში კი Var თავდაპირველი მნიშ-
ვნელობით დარჩება.
ო
ed
თ
შა
u.
ერ
მუ
bt
set ბრძანებით შეგვიძლია ყოველგვარი ცვლადის სრული ჩამონათვალი ვნახოთ თა-
მწ
ვისი მნიშვნელობებით, მათ შორის shell-ის ფუნქციებიც (მათ მოგვიანებით განვიხილავთ). რო-
სა
li@
გორც წესი, გრძელი სია დაგენრერირდება ეკრანზე. მათ დასათვალიერებლად უპრიანია less
მო
გამოვიყენოთ:
ის
vi
ბი
არ
POSIX სტანდარტთან შესაბამისობა გავააქტიუროთ. ასე უკვე, ბრძანება set ფუნქციებს აღარ
ba
გარემოს მნიშვნელობა
il.
ვთ
ცვლადი
ch
ar
97
OLDPWD წინა დირექტორია, სადაც მიმდინარე დირექტორიამდე ვიმყოფებოდით. cd -
ბრძანება იყენებს სწორედ ამ ცვლადს.
:
ზე
LANG მიმდინარე ენის, ლოკალიზაციისა და კოდირების პარამეტრები.
ა
სტ
ა!
ო
Shell-ის მნიშვნელობა
ცვლადი
სი
ფ
PS1 shell-ის მოსაწვევი (Prompt String). ტექსტი, რომელიც ბრძანების აკრე-
ge
.
ფამდე ჩანს ტერმინალზე. მისი გამოჩენა იმის მანიშნებელია, რომ shell
ელ
ვე
მზადაა ახალი ბრძანება მიიღოს და შეასრულოს.
u.
HISTFILE ნაგულისხმევი მნიშვნელობით, bash ჩვენ მიერ გაშვებული ბრძანებების
ო
ed
სახელებს ინახავს ამ ფაილში. სწორედ ამიტომაა, რომ ზედა ისრით წინა
თ
ბრძანებების ნახვა და გაშვება შეგვიძლია.
შა
u.
HISTFILESIZE ბრძანებების მაქსიმალური რაოდენობა, რომლის შენახვაც ზემოთ ნახსე-
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
ra
ეს
/home/achiko
ba
/home/achiko
liz
შე
ამ ცვლადების მნიშვნელობები:
il.
ვთ
ch
achiko@debian:∼$ cd Documents/
ხო
/home/achiko
achiko@debian:∼/Documents$ echo $PWD
გთ
/home/achiko/Documents
98
achiko@debian:∼/Documents$ echo $OLDPWD
/home/achiko/
:
ცვლადია, რადგან ამ ცვლადის შიგთავსზეა დამოკიდებული სისტემა გაუშვებს თუ არა პირდა-
ზე
პირ ჩვენს მიერ აკრეფილ ბრძანებას.
ა
სტ
achiko@debian:∼/Documents$ ls
Desktop/ file1 GPL2.txt Pictures/ Videos/
ა!
Documents/ file2 GPL3.txt Public/
ო
Downloads/ file3 Music/ Templates/
სი
ფ
რ
ge
შედეგი ეკრანზე დაიწერა. shell-მა ls ბრძანების ადგილმდებარეობა იპოვა (ბრძანებაც
.
ელ
ხომ ფაილია და ისიც რომელიღაც დირექტორიაშია შენახული) და გაუშვა. შევხედოთ PATH-ს.
ვე
u.
achiko@debian:∼/Documents$ echo $PATH
ო
ed
თ
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
შა
u.
ერ
ჩვენ მიერ აკრეფილი ბრძანება ერთ-ერთ ამ ჩამოთვლილ დირექტორიაში აღმოჩნდა
მუ
bt
და ამიტომაც გაეშვა. მოდით, დავრწმუნდეთ, რომ ეს ასეა:
მწ
სა
li@
achiko@debian:∼/Documents$ PATH=""
მო
achiko@debian:∼/Documents$ ls
ის
sh
ვა. ამისდა მიუხედავად, ბრძანების გაშვება მაინც შეგვიძლია, მხოლოდ მისი სრული გზის მი-
ra
ეს
თითებით, ასე:
შვ
ba
ნი
achiko@debian:∼/Documents$ /bin/ls
liz
მის გასაშვებად. სწორედ ამიტომ, თუ საკუთარ ბრძანებებს შევქმნით, უმჯობესია, ისინი ერთ
ar
99
achiko@debian:∼/Documents$ PATH=new directory:$PATH
:
ზე
ის ბრძანება გაეშვება, რომელიც პირველად შეხვდება shell-ს. PATH-ის ძველი მნიშვნელობის
აღსადგენად მას ხელახლა უნდა მივანიჭოთ ძველი მნიშვნელობა ან შელის მიმდინარე სესია
ა
დავხუროთ და ახალი გავუშვათ, რათა თავიდან შეიქმნას ცვლადები.
სტ
მოდით ახლა, სანამ ჩვენ თავად შევქმნით ახალ ცვლადს, უკვე არსებული შელის ერ-
თი ცვლადიც განვიხილოთ - PS1. როგორც უკვე ვთქვით, ის შელის მოსაწვევია და ბრძანების
ა!
ო
აკრეფამდე რასაც ვხედავთ, სწორედ PS1 ცვლადის მნიშვნელობას წარმოადგენს. ვნახოთ, რა
წერია ამ ცვლადში:
სი
ფ
რ
ge
.
achiko@debian:∼/Documents$ echo $PS1
ელ
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
ვე
u.
ცოტა გაუგებარი შიგთავსია. ამდენი რამ ნამდვილად არ გამოდის ეკრანზე. ასე იმიტომ
ო
ed
თ
მოხდა, რომ PS1 დინამიკური ცვლადია და მას გარკვეული სპეციალური სიმბოლოების გაგება
შა
ე
შეუძლია. ეს სიმბოლოები კოდირებულია და მათ ქვეშ სხვადასხვა მნიშვნელობა იგულისხმება.
u.
ერ
PS1 იგებს შემდეგ სიმბოლოებს:
მუ
bt
\h კომპიუტერის სახელი.
მწ
სა
li@
\u მომხმარებლის სახელი.
მო
\w
ის
sh
\d მიმდინარე თარიღი.
ნე
ra
შვ
liz
ch
100
Hello Georgia PS1="Hello Georgia2 "
Hello Georgia2
Hello Georgia2
:
ზე
debian
debian echo Gamarjoba
ა
Gamarjoba
სტ
debian
ა!
ო
achiko@debian:∼$ PS1="User=\u\ndir=\w\ntime=\t \$ "
სი
ფ
User=achiko
dir=∼/Downloads
ge
.
time=14:29:31 $
ელ
User=achiko
ვე
u.
dir=∼/Downloads
time=14:29:33 $ echo Gamarjoba
ო
ed
თ
Gamarjoba
შა
User=achiko
ე
u.
ერ
dir=∼/Downloads
მუ
time=14:29:33 $
bt
მწ
სა
li@
მოდით, ახლა მიმდინარე სესიაში ჩვენ თავად შევქმნათ ახალი ცვლადი:
მო
ის
sh
ra
ეს
ba
cvladi='HELLO World!'
ნი
liz
achiko@debian:∼$ printenv
...
ch
ხო
ar
101
ვათ bash-ის ახალი პროცესი მიმდინარე bash-ში და შევამოწმოთ cvladi-ის მნიშვნელობა.
achiko@debian:∼$ bash
achiko@debian:∼$ echo $cvladi
:
ზე
არაფერი გამოვიდა ეკრანზე. ახლად გაშვებული bash რომ ნამდვილად ძველი bash
პროცესის შვილი პროცესია, შეგვიძლია ასე დავრწმუნდეთ:
ა
სტ
achiko@debian:∼$ ps jf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
ა!
ო
11435 11436 11436 11436 pts/1 16596 Ss 1000 0:00 -bash
სი
11436 16588 16588 11436 pts/1 16596 S 1000 0:00 \_ bash
ფ
16588 16596 16596 11436 pts/1 16596 R+ 1000 0:00 \_ ps jf
ge
...
.
ელ
ვე
u.
დავბრუნდეთ ორიგინალ bash-ში. ამისთვის მიმდინარე bash-დან exit ბრძანებით გა-
მოვიდეთ. მოდით, ახლა ეს ლოკალური ცვლადი გარემოს ცვლადად გადავაქციოთ.
ო
ed
თ
შა
achiko@debian:∼$ exit
ე
u.
ერ
achiko@debian:∼$ export cvladi
მუ
bt
მწ
შევამოწმოთ.
სა
li@
მო
ის
cvladi=Hello World!
ბი
არ
sh
შვ
ba
achiko@debian:∼$ bash
ნი
Hello World!
შე
ცვლადი შევქმნათ.
ვთ
ch
ar
გთ
102
achiko@debian:∼$ printenv | grep cvlad
cvladi2=Gamarjoba Georgia!
cvladi=Hello World!
achiko@debian:∼$ exit
achiko@debian:∼$ echo $cvladi2
:
ზე
ეკრანზე ვერაფერს დავინახავთ. მართალიც არის, რადგან გარემოს ცვლადები მემ-
კვიდრეობით გადადიან მამიდან შვილ პროცესებზე. ჩვენ კი შვილ პროცესში შექმნილი ცვლადი
ა
მამა პროცესს გვინდა გავაგებინოთ. ეს კი შეუძლებელია, რადგან, როცა exit ბრძანებით შვი-
სტ
ლი პროცესიდან გამოვედით, ეს პროცესი დავხურეთ. შესაბამისად, ამით იქ შექმნილი ყველა
ცვლადი განადგურდა.
ა!
ო
სი
ფ
თუმცა მამა პროცესში დაგვრჩა cvladi გარემოს ცვლადი. შეგვიძლია ის გარემოდან
ამოვაგდოთ და კვლავ ლოკალურ ცვლადად გადავაქციოთ, ასე:
ge
.
ელ
achiko@debian:∼$ export -n cvladi
ვე
u.
ო
ed
თ
შევამოწმოთ:
შა
u.
ერ
achiko@debian:∼$ printenv | grep cvladi
მუ
bt
მწ
სა
cvladi=Hello World!
ბი
არ
sh
ra
ეს
შვ
შევამოწმოთ.
liz
შე
მისი მნიშვნელობა აღარ გამოვიდა ეკრანზე, რადგან ცვლადი წაიშალა, აღარ არსე-
ch
103
achiko@debian:∼$ a=123
achiko@debian:∼$ echo $a
123
achiko@debian:∼$ echo $a4 ### ასე შელი გამოიტანს a4 ცვლადის
მნიშნველობას. მასში კი არაფერი წერია!
:
achiko@debian:∼$ echo ${a}4 ### ასე კი შელი გამოიტანს a ცვლადის
ზე
მნიშნველობას, რომელსაც ბოლოში მიუწერს 4-ს!
1234
ა
სტ
ახლა უკვე ნათელი გახდა. თუ ცვლადის მნიშვნელობას გვსურს ასო-ნიშნების რაიმე
ა!
რიგი მივუწეროთ, ფიგურული ფრჩხილების გამოყენება აუცილებელია.
ო
სი
ფ
10.1 ცვლადის დამუშავება
ge
.
ელ
ვე
ცვლადებზე საუბრისას უნდა ვახსენოთ expr ბრძანება, რომელიც ცვლადის მნიშვნე-
u.
ლობაში არსებულ სიმბოლოთა მწკრივს (ე.წ. string) ამუშავებს.
სადემონსტრაციოდ ავიღოთ x ცვლადი და abcABC123ABCabc მნიშვნელობა მივანიჭოთ.
ო
ed
თ
შა
achiko@debian:∼$ x=abcABC123ABCabc ე
u.
ერ
achiko@debian:∼$ echo $x
მუ
bt
abcABC123ABCabc
მწ
სა
li@
expr ბრძანებით ცვლადის სიმბოლოთა მწკრივზე სხვადასხვა მოქმედებების განხორ-
მო
vi
ბი
არ
ra
15
შვ
ba
ნი
15
ხო
104
შესაბამისად, შეგვიძლია, echo ბრძანებასაც გადავცეთ ასეთი არგუმენტი. expr ბრძა-
ნებაში წერტილით (.) ნებისმიერი სიმბოლო აღინიშნება. ფიფქით (*) კი - მის წინ მიწერილი
სიმბოლოს ბევრჯერ გამეორება.
:
ზე
achiko@debian:∼$ expr match "$string" '$substring'
ა
achiko@debian:∼$ expr "$string": '$substring'
სტ
ამ ბრძანებებით, რომლებიც ერთსა და იმავე შედეგს იძლევა, ვხედავთ არა მთლიანი
ა!
ო
ცვლადის, არამედ მისი რომელიმე ფრაგმენტის სიგრძეს.
სი
ფ
მაგალითად:
ge
.
ელ
achiko@debian:∼$ expr match $x '[a-z]*A'
4 ვე
u.
ო
ed
თ
აქ მითითებული ფრაგმენტი იწყება პატარა ასოთი ([a-z]), მეორდება რამდენჯერმე (*)
შა
და მთავრდება A ასო-ნიშნით. ასეთი ჩანაწერი ცვლადში არის abcA , ხოლო მისი სიგრძე 4.
ე ”
u.
ერ
მეორე ჩანაწერითაც იგივე შედეგს მივიღებთ:
მუ
bt
მწ
li@
4
მო
ის
vi
10
sh
ნე
ra
”
.* უშორეს A-მდე მისვლას ნიშნავს) და მისი სიგრძე არის 10.
შვ
”
ba
ნი
liz
ch
მაგალითად:
გთ
:
ზე
achiko@debian:∼$ expr substr $x 2 2
ა
bc
სტ
ა!
ასე x ცვლადიდან მე-2 პოზიციაზე მყოფი ასო-ნიშნიდან დაწყებული შემდეგი 2 სიმბო-
ო
ლო გამოვიდა - bc .
”
სი
ფ
ფრაგმენტის გამოსატანად echo ბრძანებაც შეგვიძლია გამოვიყენოთ შემდეგი სინტაქ-
სით:
ge
.
ელ
achiko@debian:∼$ echo ${string:position:length}
ვე
u.
ო
ed
თ
მაგალითად:
შა
u.
ერ
achiko@debian:∼$ echo ${x:2:2}
მუ
bt
cA
მწ
სა
li@
ეს ბრძანება x ცვლადიდან მე-2 პოზიციის შემდეგ 2 ასო-ნიშანს გამოიტანს - cA .
”
მო
vi
ბი
არ
ra
ეს
შვ
cABC123ABCabc
ნი
ab
შე
ab
il.
ვთ
ch
მესამე ბრძანება მეორის უფრო შემოკლებული ვარიანტია. ასეთი სინტაქსური ჩანაწერი expr
ბრძანებასაც ესმის:
გთ
106
cA
:
ზე
achiko@debian:∼$ expr match "$string" '\($substring\)' # ან
achiko@debian:∼$ expr "$string": '\($substring\)'
ა
სტ
თუ ფრაგმენტის განსაზღვრა x ცვლადის ბოლოდან გვსურს დავიწყოთ, მაშინ ასეთი
ა!
სინტაქსი უნდა გამოვიყენოთ:
ო
სი
ფ
achiko@debian:∼$ expr match "$string" '.*\($substring\)' # ან
ge
.
achiko@debian:∼$ expr "$string": '.*\($substring\)'
ელ
ვე
u.
მაგალითად:
ო
ed
თ
შა
u.
abcA
ერ
მუ
bt
abcABC123A
მწ
სა
bc
vi
ბი
არ
sh
ra
შვ
ba
უნდა წაიშალოს.
ar
მაგალითად:
გთ
achiko@debian:∼$ echo $x
abcABC123ABCabc
achiko@debian:∼$ echo ${x#a*A}
BC123ABCabc
107
ამ ბრძანებით x ცვლადის დასაწყისიდან წავშალეთ ასო-ნიშანთა ერთობლიობა, რომე-
ლიც იწყება a -თი და მთავრდება უახლოეს შემხვედრ A -სთან. მეორე ბრძანებით - უშორეს
” ”
შემხვედრ A -სთან. ანუ, განვახორციელეთ უშორესი წაშლა დასაწყისიდან. მესამეთი - ცვლა-
”
დის ბოლოდან უმოკლესი წაშლა, მეოთხეთი კი ბოლოდან უშორესი წაშლა.
:
BCabc
ზე
achiko@debian:∼$ echo ${x%C*c}
abcABC123AB
ა
სტ
achiko@debian:∼$ echo ${x%%C*c}
abcAB
ა!
ო
სი
ფ
რ
ge
.
ელ
ვე
u.
10.1.6 მწკრივიდან ფრაგმენტის ჩანაცვლება სხვა გამოსახულებით
ო
ed
თ
შა
u.
achiko@debian:∼$ echo ${string//substring/replacement}
ერ
მუ
bt
achiko@debian:∼$ echo ${string/%substring/replacement}
მწ
სა
li@
მო
substring replacement -ით, თუ string იწყება substring -ით, ხოლო ბოლო ბრძანე-
sh
” ” ” ”
ბით მხოლოდ იმ შემთხვევაში შეიცვლება string ცვლადში substring replacement -ით,
” ” ”
ნე
” ”
ეს
შვ
მაგალითად:
ba
ნი
achiko@debian:∼$ echo $x
liz
abcABC123ABCabc
შე
TESTABC123ABCabc
il.
ვთ
TESTABC123ABCabc
ar
abcABC123ABCabc
achiko@debian:∼$ echo ${x/%abc/TEST}
abcABC123ABCTEST
achiko@debian:∼$ echo ${x/%abcd/TEST}
abcABC123ABCabc
108
10.1.7 მწკრივში დიდი და პატარა ასოების შეცვლა/გადანაცვლება
:
achiko@debian:∼$ echo ${string∼} # პირველი ასოს გადანაცვლება
ზე
achiko@debian:∼$ echo ${string∼∼} # ყველა ასოს გადანაცვლება
ა
სტ
მაგალითად:
ა!
ო
achiko@debian:∼$ echo $x
სი
ფ
abcABC123ABCabc
achiko@debian:∼$ echo ${x^}
ge
AbcABC123ABCabc
.
ელ
achiko@debian:∼$ echo ${x^^}
ABCABC123ABCABC ვე
u.
achiko@debian:∼$ echo ${x,}
ო
ed
თ
abcabc123abcabc
achiko@debian:∼$ echo ${x,,}
შა
u.
abcABC123ABCabc
ერ
achiko@debian:∼$ echo ${x∼}
მუ
bt
AbcABC123ABCabc
მწ
li@
ABCabc123abcABC
მო
ის
sh
ra
შვ
ვიღებთ.
ნი
liz
2
achiko@debian:∼$ echo ${y:2}; echo $? # y ცვალდი შექმნილი არ არის
ch
ხო
0
ar
achiko@debian:∼$
გთ
109
${Variable:-word} თუ Variable არ არსებობს ან NULL-ია, მაშინ სტანდარტულ გა-
მოსასვლელზე მივიღებთ word-ს. სხვა შემთხვევაში - Variable-ის
მნიშვნელობას.
:
დაიბეჭდება.
ზე
${Variable:+word} თუ Variable არ არსებობს ან NULL-ია, მაშინ არაფერი შეიცვლება.
ა
სხვა შემთხვევაში, სტანდარტულ გამოსასვლელზე მივიღებთ word-ს.
სტ
${Variable:?word} თუ Variable არ არსებობს ან NULL-ია, მაშინ შეცდომების გა-
ა!
მოსასვლელზე მივიღებთ word შეტყობინებაზე. სხვა შემთხვევაში,
ო
Variable-ის მნიშვნელობას.
სი
ფ
სადემონსტრაციოდ ავიღოთ სამი ცვლადი a, b, c. პირველი შევქმნათ და მაში რაიმე
ge
.
მნიშვნელობა ჩავწეროთ, მეორე შევქმნათ და მასში არაფერი ჩავწეროთ, ხოლო მესამე არ
ელ
შევქმნათ. ვნახოთ, რა გამოვა:
ვე
u.
achiko@debian:∼$ a=TEST
ო
ed
თ
achiko@debian:∼$ b=''
შა
u.
ერ
TEST
მუ
bt
word
მწ
სა
li@
achiko@debian:∼$ echo ${c:-word}
word
მო
vi
word
ბი
sh
ნე
შვ
TEST
ნი
bash: b: word
შე
bash: c: word
il.
TEST
ch
word
ar
achiko@debian:∼$ echo $b $c
word word
110
ფაილის სახელი გამოვიტანოთ, ან მხოლოდ იმ დირექტორიის სრული სახელი, სადაც ეს ფაილი
იმყოფება. ზემოთ ნახსენები ბრძანებებით მარტივად გამოდის ეს ყველაფერი. ვნახოთ:
achiko@debian:∼$ x=/usr/share/common-licenses/GPL-3
:
” ”
ზე
achiko@debian:∼$ echo ${x%/*}
ა
/usr/share/common-licenses
სტ
achiko@debian:∼$ echo ${x##/*/}
GPL-3
ა!
ო
სი
ფ
პირველ ბრძანებაში უმოკლესი წაშლა გავაკეთეთ ბოლოდან / სიმბოლოს ჩათვლით.
”
მეორეში კი - უშორესი წაშლა დასაწყისიდან, / -დან დაწყებული ბოლო შემხვედრ / -ის ჩათ-
ge
” ”
.
ვლით.
ელ
სხვაგვარად ასე გაკეთდება:
ვე
u.
ო
ed
თ
achiko@debian:∼$ expr match $x '\(/.*\)/'
შა
/usr/share/common-licenses
ე
u.
achiko@debian:∼$ expr match $x '.*/\(.*\)'
ერ
მუ
GPL-3
bt
მწ
სა
”
ეს ფუნქცია მარტივად სრულდება უკვე არსებული სხვა ბრძანებებით. მაგალითად,
ის
vi
dirname-ით პირდაპირ დირექტორიის სახელი გამოვა სრული გზიდან, ხოლო basename-ით მხო-
ბი
sh
ნე
achiko@debian:∼$ dirname $x
ra
ეს
/usr/share/common-licenses
შვ
ba
achiko@debian:∼$ basename $x
GPL-3
ნი
liz
შე
basename მხოლოდ ფაილებზე მოქმედებს (ანუ გამყოფი / უნდა იყოს და არა სხვა სიმბო-
”
ლო) expr და echo ბრძანებები კი ზოგადია. მაგალითად, თუ გვსურს, რომ PATH ცვლადიდან
il.
ვთ
პირველი და ბოლო დირექტორიის სრული გზა ამოვიღოთ, შემდეგი ბრძანებები უნდა გავუშ-
ch
ვათ:
ხო
ar
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
achiko@debian:∼$ echo ${PATH##/*:} # ბოლო დირექტორია
/usr/games
achiko@debian:∼$ expr $PATH : '.*:\(.*\)' # ბოლო დირექტორია
/usr/games
111
achiko@debian:∼$ echo ${PATH%%:*} # პირველი დირექტორია
/usr/local/bin
achiko@debian:∼$ expr $PATH : '\([^:]*\)' # პირველი დირექტორია
/usr/local/bin
:
ზე
10.2 მარტივი არითმეტიკული გამოთვლები
ა
expr ბრძანება აგრეთვე გამოიყენება მარტივი მათემატიკური გამოთვლებისთვის. მას
სტ
შეუძლია შემდეგი არითმეკურული ოპერაციების შესრულება (ოპერატორების წინ \ იწერება):
”
ა!
ო
achiko@debian:∼$ expr 7 \+ 5 # მიმატება
სი
ფ
12
achiko@debian:∼$ expr 7 \- 5 # გამოკლება
ge
.
2
ელ
achiko@debian:∼$ expr 7 \* 5 # გამრავლება
ვე
u.
35
achiko@debian:∼$ expr 7 \/ 5 # გაყოფა
ო
ed
თ
1
შა
achiko@debian:∼$ expr 7 \% 5
ე
# ნაშთით გაყოფა
u.
ერ
2
მუ
achiko@debian:∼$ expr \( 11 \+ 5 \) \* 3
bt
48
მწ
სა
li@
მო
გამოყენებაც [ ], ასე:
ბი
არ
sh
ra
12
ეს
შვ
12
ნი
32
შე
achiko@debian:∼$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation,
Inc.
This is free software with ABSOLUTELY NO WARRANTY.
112
For details type `warranty'.
4+3
7
3^4
81
:
ზე
(23-15)/4+98
100
ა
სტ
15/4
3
ა!
ო
სი
ფ
scale=5 # ციფრების რაოდენობა მძიმის შემდეგ
15/4
ge
.
3.75000
ელ
ვე
u.
quit # ამ ბრძანებით გამოვდივართ bc ბრძანებიდან
ო
ed
თ
bc ბრძანებით რთული გამოთვლების წარმოებაც არის შესაძლებელი. ტრიგონომეტ-
შა
ე
რიული (sin(x), cos(x), arctg(x)...), ლოგარითმული (ln(x), logn (x) ...) და სხვა ფუნქციების
u.
ერ
გამოსაყენებლად ბრძანებას უნდა ჩავურთოთ სტანდარტული მათემატიკური ბიბლიოთეკა, -l
მუ
bt
მწ
სა
li@
achiko@debian:∼$ bc -l
მო
1/17
ის
.05882352941176470588
vi
ბი
არ
sh
ra
ეს
შვ
25.71
ნი
3.12926
შე
10715086071862673209484250490600018105614048117055336074437503883703\
il.
ვთ
51051124936122493198378815695858127594672917553146825187145285692314\
04359845775746985748039345677748242309854210746050623711418779541821\
ch
53046474983581941267398767559165543946077062914571196477686542167660\
ხო
429831652624386837205668069376
ar
გთ
√
achiko@debian:∼$ x=7; echo "scale=10; sqrt($x)" | bc -l # x
2.6457513110
achiko@debian:∼$ echo "scale=500; 4*a(1)" | bc -l # arctg(1)=π/4
113
3.141592653589793238462643383279502884197169399375105820974944592307\
81640628620899862803482534211706798214808651328230664709384460955058\
22317253594081284811174502841027019385211055596446229489549303819644\
28810975665933446128475648233786783165271201909145648566923460348610\
45432664821339360726024914127372458700660631558817488152092096282925\
40917153643678925903600113305305488204665213841469519415116094330572\
:
70365759591953092186117381932611793105118548074462379962749567351885\
ზე
75272489122793818301194912
ა
სტ
როგორც ვნახეთ, bc ბრძანებას დიდი შესაძლებლობები აქვს. თუმცა, shell ნამდვილად
არ შექმნილა რთული არითმეტიკული გამოთვლების საწარმოებლად.
ა!
ო
სი
ფ
რ
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
114
თავი 11
:
ა ზე
ტექსტის დამუშავება
სტ
ა!
ო
სი
ფ
ექსტური ფაილები ფართოდაა წარმოდგენილი UNIX-ის მსგავს ყველა სისტემაში. ბევ-
ge
.
ელ
მატში ინახავს. ასეთ ფორმატში დიდი დოკუმენტებიც შენახვაცაა შესაძლებელი. ერთ-
ვე
ერთი გავრცელებული მიდგომა დიდი დოკუმენტების შექმნისას, სწორედ ისაა, რომ მათ
u.
ჯერ ტექსტურ ფორმატში ქმნიან და შემდეგ კი სვამენ ერთ-ერთ ისეთ სტრუქტურაში, სადაც გარ-
ო
კვეული აღნიშვნებით, მონიშვნებით, ტექსტის გამოტანის გარეგნულ სტილს განსაზღვრავენ.
ed
თ
მათ მონიშვნების ენას (markup language) უწოდებენ. მსოფლიოში ყველაზე გავრცელებული
შა
ე
ელექტრონული დოკუმენტი, ალბათ, ვებ-გვერდებია. ისინი ტექსტური ფორმატის ფაილებია,
u.
ერ
რომლებიც დოკუმენტის ვიზუალური ფორმატის აღსაწერად ჰიპერტექსტის (HTML) ან გაფარ-
მუ
bt
თოებულ მონიშვნის ენას (XML) იყენებენ. ელექტრონული ფოსტაც ტექსტზე დაფუძნებული
მწ
საშუალებაა. ელ. ფოსტაში დაწერილი ტექსტი, მასზე მიბმული ნებისმიერი ფაილი, საბოლო-
სა
li@
ოდ, ტექსტად წარმოდგინდება და ისე იგზავნება ადრესატთან. UNIX-ის მსგავს სისტემებში
მო
(PostScript) - გვერდის აღწერის ენით, შემდეგ კი გადაეცემა პროგრამას, რომელიც ქმნის გრა-
ბი
არ
ორობით ფორმატში.
შვ
liz
11.1 tac
შე
ფაილი test.txt.
ch
ხო
115
achiko@debian:∼$ cat test.txt
erti
ori
sami
:
achiko@debian:∼$ tac test.txt
ზე
sami
ori
ა
erti
სტ
ა!
ო
11.2 head, tail
სი
ფ
ბრძანება head-ს ფაილის საწყისი ნაწილი გამოაქვს, tail ბრძანებას - ბოლო ნაწილი.
ge
.
ელ
achiko@debian:∼$ head /etc/passwd
ვე
u.
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
ო
ed
თ
bin:x:2:2:bin:/bin:/usr/sbin/nologin
შა
sys:x:3:3:sys:/dev:/usr/sbin/nologin
ე
u.
sync:x:4:65534:sync:/bin:/bin/sync
ერ
მუ
games:x:5:60:games:/usr/games:/usr/sbin/nologin
bt
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
მწ
სა
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
li@
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
მო
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
ის
vi
ბი
არ
ტანს.
ნე
head ბრძანება საქმეში როგორც ფილტრი, ისე რომ ვნახოთ, ჯერ /etc/passwd გავ-
ra
ეს
ხსნათ, შემდეგ, ეკრანზე გამოტანის ნაცვლად, pipe-ის დახმარებით, head ბრძანებას გადავცეთ
შვ
root:x:0:0:root:/root:/bin/bash
შე
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
e
bin:x:2:2:bin:/bin:/usr/sbin/nologin
il.
ვთ
sys:x:3:3:sys:/dev:/usr/sbin/nologin
ch
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
ხო
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
ar
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
გთ
გამოიყენება. იგი სტანდარტად 1500-იანი წლებიდან იქცა, როდესაც უცნობმა მბეჭდავმა ამწყობ დაზგაზე წიგნის საც-
დელი ეგზემპლარი დაბეჭდა. Lorem Ipsum-ის გამოყენებით ვღებულობთ იმაზე მეტ-ნაკლებად სწორი გადანაწილების
ტექსტს, ვიდრე ერთი და იგივე გამეორებადი სიტყვებია ხოლმე. შედეგად, ტექსტი ჩვეულებრივ ინგლისურს ჰგავს, მისი
წაითხვა და გაგება კი შეუძლებელია. გავრცელებული მოსაზრებით, Lorem Ipsum შემთხვევითი ტექსტი სულაც არაა.
მისი ფესვები ჯერ კიდევ ჩვ. წ. აღ-მდე 45 წლის დროინდელი კლასიკური ლათინური ლიტერატურიდან მოდის.
116
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
:
ზე
achiko@debian:∼$ cat /etc/passwd | head -n 3
root:x:0:0:root:/root:/bin/bash
ა
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
სტ
bin:x:2:2:bin:/bin:/usr/sbin/nologin
ა!
ო
n ოფციის მითითება აუცილებელი არ არის. ასეთი ჩანაწერიც იმავე შედეგს მოგვცემს.
სი
ფ
რ
ge
.
achiko@debian:∼$ cat /etc/passwd | head -3
ელ
root:x:0:0:root:/root:/bin/bash
ვე
u.
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
ო
ed
თ
შა
ე
ხაზების გარდა, head-ს შეუძლია საწყისი N რაოდენობის ბაიტი გამოიტანოს ეკრანზე
u.
ერ
-c ოფციით.
მუ
bt
მწ
სა
vi
ყურადღება
ბი
არ
sh
ra
ეს
შვ
head ბრძანებაზე ჩვენ მიერ ნახსენებ ყველა ოფციას - tail ბრძანებაც იგებს, მხოლოდ,
liz
საწყისი ნაწილის ნაცვლად, მას ბოლო ნაწილი გამოაქვს (ბოლო ხაზები, ბოლო ასო-ნიშნები).
შე
sshd:x:112:65534::/run/sshd:/usr/sbin/nologin
ch
saned:x:114:118::/var/lib/saned:/bin/false
achiko:x:1000:1000:Archil:/home/achiko:/bin/bash
ხო
ar
117
ეს ბრძანება /etc/passwd ფაილის ბოლო 8 ასო-ნიშანს გამოიტანს. აქ, მე-8 ასო-ნიშანი
უხილავია, ის ახალ ხაზზე გადასვლის სიმბოლოა. ამიტომაც აღმოჩნდა shell-ის მოსაწვევი შემ-
დეგ ხაზზე.
tail-ს, head-ისგან განსხვავებით, დამატებით ერთი ძალიან სასარგებლო ოფცია აქვს,
-f. როგორც ვნახეთ, head და tail ბრძანებები ეკრანზე გვაჩვენებენ შედეგს, ამით პროცესი
მთავრდება და სხვა ბრძანების აკრეფის საშუალება გვეძლევა shell-ში. -f ოფციის მითითე-
ბით კი ეს პროცესი არ წყდება, არამედ გააგრძელებს ფაილში დამატებული ტექსტის ჩვენებას
:
ზე
ეკრანზე დინამიკურად და მანამდე გაგრძელდება, სანამ ჩვენ თვითონ ხელით, Ctrl^c კლა-
ვიშების კომბინაციით, არ შევწყვეტთ. ანუ ასე ფაილის შიგთავსს რეალურ დროში ვუყურებთ.
ა
დემონსტრირებისთვის გავხსნათ 2 ტერმინალი და ავკრიფოთ შესაბამისი ბრძანებები:
სტ
ტერმინალი 1 ტერმინალი 2
ა!
ო
$ tail -f test.txt $ ls >> test.txt
სი
erti $ ls /bin >> test.txt
ფ
ori $
ge
sami
.
ელ
...
ვე
u.
პირველ ტერმინალზე დავინახავთ იმას, რაც test.txt-ს ბოლოში დავუმატეთ მეორე
ტერმინალიდან. რა ინფორმაციაც უნდა დავუმატოთ test.txt-ს ბოლოში, ყველაფერი გამოჩ-
ო
ed
თ
ნდება პირველ ტერმინალში, სანამ Ctrl^c -თი არ დავხურავთ tail -f ბრძანებას.
შა
u.
ერ
მუ
11.3 sort
bt
მწ
li@
ლათინური ანბანის მიხედვით. მაგალითისთვის ავიღოთ /etc/passwd ფაილი.
მო
ის
vi
avahi:x:111:116::/var/run/avahi-daemon:/bin/false
sh
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
ნე
bin:x:2:2:bin:/bin:/usr/sbin/nologin
ra
ეს
colord:x:113:117::/var/lib/colord:/bin/false
შვ
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
ba
...
ნი
liz
თაა დალაგებული.
e
il.
ვთ
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
ხო
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
ar
usbmux:x:106:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false
sys:x:3:3:sys:/dev:/usr/sbin/nologin
გთ
...
118
/etc/passwd ფაილში, როგორც ვნახეთ, ინფორმაცია სვეტებადაა ორგანიზებული და
მათ შორის გამყოფი ასო-ნიშანია ორწერტილი :. ამ ფაილს დეტალურად მოგვიანებით გან-
ვიხილავთ. მესამე სვეტში მხოლოდ რიცხვებია მოცემული. მოდით, დავახარისხოთ ფაილის
შიგთავსი ხაზების მესამე სვეტში ჩაწერილი რიცხვების მიხედვით. -n სწორედ რიცხვითი მნიშ-
ვნელობით ახარისხებს ხაზებს. -k ოფციით კი შესაძლებელია სასურველი სვეტის მითითება.
რადგან საქმე სვეტს ეხება, უნდა ვიცოდეთ სად მთავრდება ერთი სვეტი და სად იწყება მეორე,
ანუ სვეტებს შორის გამყოფი სიმბოლოს მითითებაც საჭიროა. ეს -t ოფციითაა შესაძლებელი.
:
ზე
მის გარეშე გამოტოვება ან ტაბულაცია იგულისხმება. ჩვენს შემთხვევაში, ეს სიმბოლო ორწერ-
ტილია.
ა
სტ
achiko@debian:∼$ cat /etc/passwd | sort -n -k3 -t:
root:x:0:0:root:/root:/bin/bash
ა!
ო
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
სი
ფ
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
ge
.
sync:x:4:65534:sync:/bin:/bin/sync
ელ
...
ვე
u.
მოდით, -k ოფციის უფრო ფართო შესაძლებლობები ვნახოთ. ნიმუშისთვის ავიღოთ
ო
ed
თ
ერთი ტექსტური ფაილი, სადაც ჩამოწერილი გვაქვს ლინუქსის დისტრიბუტივების სახელები,
შა
ე
მათი ვერსიების ნომრები და გამოშვების თარიღები (დღე/თვე/წელი).
u.
ერ
მუ
bt
achiko@debian:∼$ cat distros.txt
მწ
li@
Debian 8.10 09/12/2017
მო
Fedora 28 01/05/2018
ba
Fedora 27 14/11/2017
ნი
Fedora 26 11/07/2017
liz
შე
Fedora 28 01/05/2018
ხო
119
Fedora 26 11/07/2017
RHEL 7.3 03/11/2016
Ubuntu 16.10 13/10/2016
Debian 7.11 04/06/2016
-k3.7 ჩანაწერით ვუთითებთ, რომ დალაგება მოხდეს მე-3 სვეტის მე-7 ელემენტიდან
:
ზე
(ანუ წელიწადით), -k3.4 და -k3.1 კი დალაგებას მე-3 სვეტის მე-4 (თვე) და პირველი (დღე)
ელემენტიდან ახორციელებს. n და r კლებადობით დალაგებას უზრუნველოყოფს რიცხვებით,
ა
b ოფცია კი უზრუნველყოფს დასაწყისში არსებული გამოტოვებების (leading blanks) უგულე-
სტ
ბელყოფას.
მოდით, უფრო დეტალურად შევხედოთ: sort ბრძანება ასე აღიქვამს ხაზს - Debian
”
ა!
ო
9.4 10/03/2018 . პირველი სვეტია Debian , მეორე - 9.4 , მესამე კი - 10/03/2018 . ანუ
” ” ”
მეორე და მესამე სვეტებს წინ გამოტოვებები შერჩათ. სწორედ ამიტომაა აუცილებელი b ოფ-
სი
ფ
ციის მითითება. სვეტებს შორის გამყოფი რომ ორწერტილი (:) ყოფილიყო, b ოფცია საჭირო
აღარ იქნებოდა.
ge
.
ელ
ლინუქსში ოფციების მითითებისას ყურადღება უნდა მივაქციოთ ასო-ნიშნის რეგის-
ვე
ტრს. ასე, მაგალითად, -r (--reverse) თუ ანბანის მიხედვით უკუღმა ახარისხებს ხაზებს, -R
u.
(--random-sort) ოფციით დახარისხება შემთხვევითი წესით ხდება. -R ოფციით ყოველ ჯერზე
ო
ed
სხვადასხვა რიგითობით გამოვა ხაზები.
თ
შა
u.
ერ
achiko@debian:∼$ cat distro.txt | sort -R
მუ
bt
RHEL 7.4 01/08/2017
მწ
სა
...
li@
achiko@debian:∼$ cat distro.txt | sort -R
მო
Fedora 27 14/11/2017
vi
...
ბი
არ
sh
ნე
ra
ეს
11.4 uniq
შვ
ba
ავიღოთ კვლავ ჩვენი სატესტო ფაილი test.txt და ისე დავარედაქტიროთ, რომ მასში
შე
erti
ხო
ori
ar
ori
sami
გთ
erti
ori
120
ასეთი მე-2 და მე-3 ხაზებია. ერთმანეთზე მიჯრილი სხვა ერთნაირი ხაზები ჩვენს ფაილში არ
გვაქვს.
:
sami
ზე
erti
ori
ა
სტ
რადგან uniq მიწყობილ ხაზებს უყურებს, ამიტომ ის ხშირად გამოიყენება sort-თან
ა!
კომბინაციაში. sort ჯერ ყველა ერთნაირ ხაზებს მიაწყობს ერთმანეთს, შემდეგ კი uniq მხო-
ო
ლოდ ერთ ეგზემპლიარს გამოიტანს.
სი
ფ
რ
ge
achiko@debian:∼$ cat test.txt | sort | uniq
.
ელ
erti
ori ვე
u.
sami
ო
ed
თ
შა
u.
ერ
მუ
bt
achiko@debian:∼$ cat test.txt | sort | uniq -u
მწ
sami
სა
li@
მო
sh
erti
ra
ეს
ori
შვ
ba
liz
შე
2 erti
il.
3 ori
ვთ
ch
ar
2 erti
3 ori
121
ხაზებს წინ თავსართი უწერიათ, მაგალითად, როდესაც ისინი დანომრილია და საჭიროა ამ
ნომრების უგულებელყოფა. მოდით, ავიღოთ ჩვენი სატესტო ფაილი დანომრილი ფორმით და
გამოვიტანოთ მხოლოდ უნიკალური ხაზი.
:
2 ori
ზე
3 ori
4 sami
ა
5 erti
სტ
6 ori
achiko@debian:∼$ cat test.txt | sort -k2b | uniq -s2 -u
ა!
ო
4 sami
სი
ფ
შედეგი სწორია. ხაზი sami , იმის გათვალისწინებით, რომ პირველი 2 სიმბოლო (ნო-
ge
”
.
მერი და გამოტოვება) უგულებელვყავით, ნამდვილად ერთადეთია ამ ფაილში.
ელ
ვე
ბრძანება uniq-ს სხვა შესაძლებლობებიც აქვს და მათი ნახვა მის სახელმძღვანელო
u.
გვერდზეა შესაძლებელი: man uniq.
ო
ed
თ
11.5 cut
შა
u.
ერ
ბრძანება cut-ით ფაილებში ხაზის გარკვეული ნაწილის გამოტანა შეიძლება. მისი შემ-
მუ
bt
დეგი ორი ოფცია ყველაზე ხშირად გამოიყენება. ესენია:
მწ
სა
li@
-c N გამოაქვს ფაილის ყოველი ხაზის მე-N ბაიტი.
მო
sh
ra
შვ
ba
liz
შე
7 მე-7
il.
ვთ
3- მე-3-დან ბოლომდე
გთ
122
achiko@debian:∼$ cat lorem.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nam ultricies elit at cursus iaculis.
Nunc suscipit lacus egestas ullamcorper efficitur.
Maecenas hendrerit sapien suscipit tincidunt egestas.
Cras ultrices diam quis faucibus rhoncus.
:
ზე
ეს ბრძანება lorem.txt-ის თითოეული ხაზიდან მე-7 ბაიტს (ასო-ნიშანს) გამოიტანს.
ა
სტ
achiko@debian:∼$ cat lorem.txt | cut -c7
i
ა!
ო
t
სი
ფ
u
a
ge
.
l
ელ
ვე
u.
ეს კი - მე-7 ბაიტიდან ყველა ასო-ნიშანს ბოლომდე:
ო
ed
თ
achiko@debian:∼$ cat lorem.txt | cut -c7-
შა
u.
orempit amet, consectetur adipiscing elit.
ერ
am urat cursus iaculis.
მუ
bt
unc s egestas ullamcorper efficitur.
მწ
li@
ras tquis faucibus rhoncus.
მო
ის
sh
ნე
e
il.
ar
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
...
123
ეკრანზე მთლიანი შიგთავსი გამოვიდა და არა მესამე სვეტი. საქმე ისაა, რომ ჩვენ არ
მიგვითითებია სვეტებს შორის გამყოფი სიმბოლო. შესაბამისად, cut ბრძანებამ ტაბულაციის
სიმბოლო იგულისხმა. თუმცა, რადგან ამ ფაილში ტაბულაციაც არ არის ჩაწერილი, ამიტომ
გამოგვიტანა ასეთი გამოსასვლელი.
მოდით, მივუთითოთ სვეტებს შორის გამყოფი სიმბოლო და ვნახოთ რა გამოვა:
:
achiko@debian:∼$ cat lorem.txt | cut -f3 -d:
ზე
0
1
ა
სტ
2
3
...
ა!
ო
სი
ფ
ეს შედეგი ნამდვილად მესამე სვეტია.
ge
.
ელ
achiko@debian:∼$ cat lorem.txt | cut -f1,7 -d:
ვე
u.
root:/bin/bash
daemon:/usr/sbin/nologin
ო
ed
თ
bin:/usr/sbin/nologin
sys:/usr/sbin/nologin
შა
u.
...
ერ
მუ
bt
ამგვარად, პირველი და მეშვიდე სვეტი გამოვა.
მწ
სა
li@
მო
11.6 paste
ის
vi
აერთიანებს.
sh
ჩვენს მიერ უკვე გამოყენებული distro.txt-დან თითო სვეტს. ხელით რომ არ ვაკეთოთ ეს
ra
ეს
ba
liz
შევამოწმოთ.
ვთ
ch
Debian
ar
Debian
გთ
Debian
Ubuntu
Ubuntu
Ubuntu
RHEL
124
RHEL
RHEL
Fedora
Fedora
Fedora
9.4
:
8.10
ზე
7.11
18.04
ა
17.10
სტ
16.10
7.5
ა!
ო
7.4
სი
ფ
7.3
28
ge
.
27
ელ
26
ვე
u.
10/03/2018
09/12/2017
ო
ed
თ
04/06/2016
შა
26/04/2018
ე
u.
19/10/2017
ერ
მუ
13/10/2016
bt
10/04/2018
მწ
01/08/2017
სა
li@
03/11/2016
მო
01/05/2018
ის
14/11/2017
vi
11/07/2017
ბი
არ
sh
ნე
შვ
ba
01/05/2018 Fedora 28
14/11/2017 Fedora 27
11/07/2017 Fedora 26
125
მაგალითად, ორწერტილი ავირჩიოთ, ასე:
:
26/04/2018:Ubuntu:18.04
ზე
19/10/2017:Ubuntu:17.10
13/10/2016:Ubuntu:16.10
ა
10/04/2018:RHEL:7.5
სტ
01/08/2017:RHEL:7.4
03/11/2016:RHEL:7.3
ა!
ო
01/05/2018:Fedora:28
სი
ფ
14/11/2017:Fedora:27
11/07/2017:Fedora:26
ge
.
ელ
ვე
-s ოფციით შესაძლებელია ფაილის თითოეული ხაზის შიგთავსი ერთ ხაზზე განვათავ-
u.
სოთ (ნაგულისხმევი მნიშვნელობით აქაც ტაბულიაციით გამოყოფილი) და ასეთი ფორმატით
გამოვიტანოთ შედეგი:
ო
ed
თ
შა
u.
achiko@debian:∼$ paste -d: dates.txt names.txt versions.txt
ერ
Debian Debian Debian Ubuntu Ubuntu Ubuntu RHEL ...
მუ
bt
9.4 8.10 7.11 18.04 17.10 16.10 7.5 ...
მწ
li@
მო
vi
ბი
არ
11.7 join
sh
ნე
აქვს.
ba
liz
შე
1 Georgia
il.
2 France
ვთ
3 USA
ch
4 Germany
ხო
5 Great Britain
ar
2 Paris
3 Washington
2
მატრიცის ტრანსპონირებისას, ვიღებთ ახალ მატრიცას, რომლის სვეტები საწყისი მატრიცის სტრიქონებს წარმო-
ადგენს.
126
5 London
4 Berlin
:
2 France Paris
ზე
3 USA Washington
join: cities.txt:5: is not sorted: 4 Berlin
ა
5 Great Britain London
სტ
ა!
ამიტომ, უმჯობესია, join ბრძანების გამოყენებამდე ფაილების შიგთავსი დახარისხე-
ო
ბული იყოს, რაც მსგავს შემთხვევას გამორიცხავს. join ბრძანება, ნაგულისხმევი მნიშვნელო-
სი
ფ
ბით, შედარებისას ორივე ფაილის პირველ სვეტს ითვალისწინებს. თუმცა, შეგვიძლია ეს ქცევა
შევცვალოთ -1 და -2 ოფციების საშუალებით. მოდით, შევცვალოთ მოცემულობა:
ge
.
ელ
achiko@debian:∼$ cat countries.txt ვე
u.
Georgia 1
ო
ed
France 2
თ
USA 3
შა
Germany 4 ე
u.
ერ
Great Britain 5
მუ
bt
achiko@debian:∼$ cat cities.txt
მწ
1 Tbilisi
სა
li@
2 Paris
მო
3 Washington
ის
5 London
vi
4 Berlin
ბი
არ
sh
ra
შვ
ba
1 Georgia Tbilisi
liz
2 France Paris
შე
3 USA Washington
e
ch
ar
გთ
11.8 tr
127
ში ერთდროულად, ხელის ერთი მოსმით (ასეთი ხერხით ცვლილების გაკეთებას ინგლისურად
editing on the fly -ს ეძახიან. ზემოთ ნახსენები ზოგიერთი ბრძანებით სწორედ ასე ვცვლიდით
”
ფაილის შიგთავსს. მაგალითად, cut, head, tail ბრძანებებით). შეცვლილი შიგთავსი ფაილში-
ვე არ ინახება, არამედ მხოლოდ ეკრანზე გამოდის. თუმცა, გადამისამართებით თავისუფლად
შეგვიძლია მისი შენახვაც.
tr ბრძანებაც სწორედ ასეთი ბრძანებაა. ამ ბრძანებით შესაძლებელია ასო-ნიშნების
:
წაშლა, ჩანაცვლება, შეკუმშვა. მოდით, ვნახოთ tr-ს პრაქტიკული გამოყენების რამდენიმე მა-
ზე
გალითი. შევცვალოთ პატარა ასოები დიდი ასოებით:
ა
სტ
achiko@debian:∼$ echo "lowercase letters" | tr abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ა!
LOWERCASE LETTERS
ო
სი
ფ
ასო-ნიშნების ერთობლიობა შეგვიძლია ინტერვალით მივუთითოთ ან POSIX-ის ასო-
ნიშანთა კლასი გამოვიყენოთ:
ge
.
ელ
ვე
u.
achiko@debian:∼$ echo "lowercase letters" | tr a-z A-Z
LOWERCASE LETTERS
ო
ed
თ
შა
u.
achiko@debian:∼$ echo "lowercase letters" | tr [:lower:] [:upper:]
ერ
მუ
LOWERCASE LETTERS
bt
მწ
სა
li@
მოდით, მიყოლებით გამეორებული სიმბოლოები შეკვეცოთ, -s ოფციით:
მო
ის
sh
ნე
შვ
ba
liz
შე
დოთ მის დამატებაზე. წავშალოთ ციფრების დამატება, ანუ ციფრების გარდა სხვა ასო-ნიშნები:
il.
ვთ
ch
ar
მოდით, ახლა ყველა ხაზი ერთ ხაზში მოვაქციოთ, ანუ ახალ ხაზზე გადასვლა შევცვა-
გთ
ლოთ გამოტოვებით:
128
ასე კი ყველა უხილავი სიმბოლოს წაშლა შეგვიძლია (ახალ ხაზზე გადასვლაც უხილავი
სიმბოლოა):
:
ზე
tr ბრძანებას კიდევ ერთი საინტერესო გამოყენება აქვს ტექსტის ROT13 კოდირებით
ჩაწერაში. ROT13-ით ლათინურ ანბანის ყოველი ასო 13 პოზიციით გადანაცვლდება. სახელიც
ა
სწორედ აქედან მოდის - rotate by 13 places. ამ მეთოდის ლათინურ ტექსტზე ორჯერ განხორცი-
სტ
ელებით კვლავ თავდაპირველ ტექსტს მივიღებთ, რადგან ლათინური ანბანი 26 ასო-ნიშნისაგან
შედგება.
ა!
ო
სი
ფ
achiko@debian:∼$ echo "secret text" | tr a-zA-Z n-za-mN-ZA-M
frperg grkg
ge
achiko@debian:∼$ echo "frperg grkg" | tr a-zA-Z n-za-mN-ZA-M
.
ელ
secret text
ვე
u.
მსგავს კონტექსტში, კოდირების გარდა, ხშირად ვიყენებთ სხვა ტერმინებსაც. ასეთებია
ო
ed
თ
- დაშიფვრა და ჰეშირება. მოდით, დეტალურად განვმარტოთ ისინი და ვთქვათ, რა განსხვავებაა
შა
მათ შორის:
ე
u.
ერ
კოდირება - ამ დროს ხდება მონაცემების გარდაქმნა, გადაყვანა ერთი სისტემიდან
მუ
bt
ნახვა ვებ გვერდზე ან ბინარული მონაცემის გაგზავნა ელ.ფოსტით). ამ დროს მიზანი არ არის
მწ
სა
ინფორმაციის დაფარვა, არამედ ის, რომ ადრესატმა სწორად დაინახოს გზავნილი. კოდირების
li@
მაგალითებია: ASCII, Unicode, URL encoding, Base64 და სხვა. პირველი კოდირება, რომელიც
მო
vi
sh
გოს მისთვის გამოგზავნილი შეტყობინება გზაში შეიცვალა თუ არა. ტექნიკურად ასე ხდება -
ba
ბას.
გთ
129
ცია გამგზავნის ღია გასაღებით (რომელიც მას წინასწარ აქვს). თუ არსებულმა ღია გასაღებმა
გაშიფრა დოკუმენტი, ე.ი. გამოგზავნი სწორია, რადგან მხოლოდ ადრესატისა და გამგზავნის
გასაღებები წარმოადგენს წყვილს. გაშიფვრის შედეგად მივიღებთ ჰეშს. შემდეგ ადრესატი თა-
ვად შექმნის მიღებული შეტყობინების ჰეშს და შეადარებს გაშიფრულს. თუ ისინი დაემთხვევა
ერთმანეთს, ე.ი. შეტყობინება არ შეცვლილა ხელმოწერის შემდეგ. სადღეისოდ ციფრული ხელ-
მოწერის პროცესი მთლიანად ავტომატიზებულია თანამედროვე კომპიუტერული პროგრამებით.
ჰეშირების მაგალითებია: SHA-3, MD5 (უკვე მოძველებული) და ა.შ.
:
ზე
ყურადღება
ა
სტ
კოდირება ასოცირდება მონაცემების გამოყენებადობის შენარჩუნებასთან (ერთი და იგი-
ვე მონაცემი სხვადასხვა კოდირებით სხვადასხვა ფორტამში გადაიყვანება, რათა მოხ-
ა!
ო
დეს განსვავებულ სისტემებში მისი გამოყენება, ეფექტიანი ტრანსმისია ან შენახვა), და-
შიფვრა - კონფიდენციალობის შენარჩუნებასთან, ხოლო ჰეშირება კი მონაცემთა მთლი-
სი
ფ
ანობის დაცვასთან.
ge
.
ელ
ვე
tr ბრძანებით შეგვიძლია, შევქმნათ მარტივი შემთხვევითი პაროლების გენერატორი.
u.
ო
ed
achiko@debian:∼$ cat /dev/urandom | tr -dc ?A-Za-z-0-9 | head -c8; echo
თ
dgAqC1X-
შა
ე
achiko@debian:∼$ cat /dev/urandom | tr -dc ?A-Za-z-0-9 | head -c8; echo
u.
ერ
JKA?5k8x
მუ
bt
მწ
li@
დიდი და პატარა ასოები, ციფრები, ტირე, ქვედა ტირე და კითხვის ნიშანი. შეგვიძლია პაროლის
მო
vi
ბი
არ
u#24ks%cktHQ
ნე
ARkrCGWZ#)v!
შვ
ba
3
ენტროპია ფიზიკაში თერმოდინამიკული სისტემის მახასიათებელი ფუნქციაა და სისტემის მოუწესრიგებლობის ხა-
რისხს აღნიშნავს. ინფორმაციულ სისტემებში კი ენტროპია აღნიშნავს შემთხვევითობის ხარისხს და მის წყაროს სისტე-
მაში არსებული ფიზიკური მოწყობილობები წარმოადგენს. მაგ: მაუსის ხშირი მოძრაობითაც შესაძლებელია სისტემაში
ენტროპია გავზარდოთ. ზოგადად, ენტროპია მით უფრო გაიზრდება, რაც უფრო დაიტვირთება სისტემა სხვადასხვა
ამოცანების შესრულებით.
130
თავი 12
:
ა ზე
სხვა სასარგებლო ბრძანებები
სტ
ა!
ო
სი
ფ
მ თავში განვიხილავთ ფაილებთან მიმართებაში რამდენიმე სასარგებლო ბრძანებას. ვი-
ge
.
ელ
კრიტერიუმით, ტექსტური ფაილების ფორმატრებაზე და ა.შ.
ვე
u.
12.1 ტექსტის შედარება
ო
ed
თ
შა
ე
ხშირად, მნიშვნელოვანი ფაილის დაკარგვის თავიდან აცილების მიზნით, მიზანშეწო-
u.
ერ
ნილია, მისი რამდენიმე ასლის გაკეთება. თუმცა, თუ რომელიმე მათგანში მცირე ცვლილებას
მუ
bt
არის თუ არა სხვაობა კონკრეტულ ფაილებს შორის.
მწ
სა
li@
cmp ბრძანება ბაიტ-ბაიტ ადარებს ორ ფაილს და გვეუბნება რომელ ხაზზე და რომელი
მო
მოდით, ავიღოთ ჩვენი სატესტო ფაილი გამარტივებული შიგთავსით, ასევე, მისი ასლი
vi
sh
ra
erti
ეს
ori
შვ
ba
sami
achiko@debian:∼$ cat test2.txt
ნი
erti
liz
otxi
შე
sami
e
il.
ვთ
ch
131
achiko@debian:∼$ comm test.txt test2.txt
erti
ori
otxi
sami
:
ზე
შესაძლებელია, რომელიმე სვეტი ეკრანზე არ გამოვიტანოთ. -1, -2 ან/და -3 ოფციის
გამოყენებით დავფარავთ, შესაბამისად, პირველ, მეორე ან/და მესამე სვეტს.
ა
სტ
diff ბრძანებაც ფაილების შესადარებლად გამოიყენება, თუმცა ის უფრო კომპლექსუ-
რი პროგრამაა და მეტი შესაძლებლობები აქვს. diff-ით ერთდროულად დიდი რაოდენობით
ა!
ფაილების შედარებაც შეიძლება. მას აგრეთვე შეუძლია ფაილებს შორის განსხვავება სხვა-
ო
დასხვა ფორმატში გამოიტანოს. diff ხშირად გამოიყენება პროგრამისტების მიერ საკუთარი
სი
ფ
პროგრამების საწყისი კოდების სხვადასხვა ვერსიების შესადარებლად. ამ ბრძანების მიერ ეკ-
რანზე გამოტანილ ფაილებს შორის განსხვავება, როგორც წესი, მომხმარებლისთვის ბოლომდე
ge
.
გასაგები არაა, თუმცა ეს ინფორმაცია ძალიან მნიშვნელოვანია. თუ მას ცალკე ფაილში დავი-
ელ
ვე
მახსოვრებთ, ანუ შევქმნით ე.წ. განსხვავების ფაილს (patch file ან diff file), patch ბრძა-
u.
ნებით ამ ფაილითა და ერთ-ერთი ორიგინალი ფაილით მეორე ორიგინალი ფაილის შიგთავსის
აღდგენას შევძლებთ.
ო
ed
თ
შა
u.
ერ
მუ
bt
achiko@debian:∼$ diff test.txt test2.txt
მწ
2c2
სა
li@
< ori
მო
---
ის
> otxi
vi
sh
ფაილი:
ra
ეს
შვ
ba
ar
achiko@debian:∼$ ls test*
test2.txt test.txt test.txt.orig
132
12.2 find
:
ზე
achiko@debian:∼$ find
ა
...
სტ
./versions.txt
./.lesshst
ა!
./Music
ო
./.wget-hsts
სი
ფ
შეგვიძლია კონკრეტული დირექტორია მივუთითოთ find-ს:
ge
.
ელ
ვე
u.
achiko@debian:∼$ find ∼
...
ო
ed
თ
/home/achiko/versions.txt
შა
/home/achiko/.lesshst
ე
u.
/home/achiko/Music
ერ
მუ
/home/achiko/.wget-hsts
bt
მწ
სა
li@
ეს ბრძანება ჩვენს პირად დირექტორიაში არსებულ ყველა ფაილს გვანახებს ეკრანზე.
მო
vi
achiko@debian:∼$ find ∼ | wc -l
ბი
არ
sh
839
ნე
ra
ეს
find ბრძანების ერთ-ერთი ძლიერი მხარე ისაა, რომ მას დირექტორიებში ბევრი სხვა-
შვ
ხელით უნდა მივუთითოთ, რომ მხოლოდ დირექტორიის ტიპის ფაილების ძებნა გვსურს, ასე:
liz
შე
...
il.
ვთ
/home/achiko/Templates
ch
/home/achiko/.ssh
ხო
/home/achiko/Music
ar
133
ასე დავითვლით მხოლოდ ჩვეულებრივი ტიპის ფაილებს. მოდით, დასახელებით მოვ-
ძებნოთ ფაილები.
:
ზე
ფაილის სახელის მითითებისას ზოგადობისთვის და უფრო მეტი მოქნილობისთვის შეგ-
ვიძლია * სიმბოლოს გამოყენება.
ა
სტ
achiko@debian:∼$ find ∼ -name "*.txt"
...
ა!
ო
/home/achiko/test.txt
სი
ფ
/home/achiko/lorem5.txt
/home/achiko/distros.txt
ge
/home/achiko/versions.txt
.
ელ
ვე
u.
ამ ბრძანებით მოვძებნით ყველა იმ ფაილს, რომლის სახელიც .txt-ზე მთავრდება.
ო
ed
თ
achiko@debian:∼$ find ∼ -name "*.txt" -type f
შა
u.
ერ
მუ
bt
.txt-ზე მთავრდება, და ამავდროულად, ჩვეულებრივი ტიპის ფაილია.
მწ
სა
sh
” ”
ra
შვ
მეგა (mega), გიგა (giga), ტერა (tera), პეტა (peta), ეგზა (exa), ძეტა (zetta). მაგალითად, ბაი-
ba
ტის შემთხვევაში, KB ნიშნავს 103 =1000 ბაიტს. ანუ ეს თავსართი 10-ის ხარისხებით მოიცემა.
ნი
რადგან ორობითი სისტემა ინფორმაციულ სისტემებში ძალიან მნიშვნელოვანია, IEC-მ 2-ის ხა-
liz
KiB არის 210 =1024 ბაიტი. IEC-მ ეს ერთეულები მოგვიანებით, 1998 წელს შემოიტანა, თუმ-
e
1
ბაიტი არის ზომის აღმნიშვნელი ერთეული ინფორმაციულ სისტემებში. ის შედგება 8 ბიტისგან. ბიტი არის მონაცე-
ch
მის ყველაზე პატარა ერთეული, რომელსაც კომპიუტერი იყენებს. ბიტით აღინიშნება ინფორმაციის მდგომარეობა, რო-
გორიც კი და არა , 1 და 0 , ჭეშმარიტი და მცდარი ან სხვა. კომპიუტერის შემადგენელ ნაწილებში სწორედ
ხო
” ” ” ” ” ”
ასეთი მდგომარეობით აღიწერება ინფორმაცია: მაღალი/დაბალი ძაბვა, დენი გადის/არ გადის (ჩიპებში), ელექტრული
ar
მუხტი არის/არ არის (მეხსიერებაში, ფლეშ-დისკებზე), ბილიკი დამაგნეტებული არის/არ არის (დისკებზე)... 4 ბიტს
ერთად ეწოდება ნიბლი. 1 ბაიტით შეიძლება გადმოიცეს ინფორმაციის 256 მდგომარეობა. 1 ბაიტი საბასიზო ლათი-
გთ
ნური ანბანის 1 სიმბოლოს ზომაა. მახვილიანი და მსგავსი ასო-ნიშნები (როგორიცაა: é,è,ê,à,û...) 2 ბაიტის ტოლია.
ქართული ასო-ნიშნები კი 3 ბაიტი ზომისაა.
2
IEEE (Institute of Electrical and Electronics Engineers) არის საერთაშორისო არამომგებიანი, პროფესიული
ორგანიზაცია გაღრმავებულ ტექნოლოგიებში. სტანდარტების შემოთავაზებასა და დამკვიდრებაში ის მსოფლიოს ერთ-
ერთი ლიდერია.
3
IEC (International Electrotechnical Commission) არის სტანდარტების მსოფლიოს ერთ-ერთი წამყვანი ორგანი-
ზაცია ელექტრულ, ელექტრონულ და მასთან დაკავშირებულ ტექნოლოგიებში.
134
90-იანი წლების ბოლომდე KB-ში 1024 ბაიტი იგულისხმებოდა და ასეთი აღნიშვნა დღესაც
შენარჩუნებულია სხვადასხვა ოპერაციულ სისტემასა თუ ბრძანებაში. როგორც უკვე ვნახეთ,
find ბრძანების გამოყენებისას 1 KB-ში 1024 ბაიტი იგულისხმება.
უფრო დიდი ზომის აღსანიშნავად შემოღებულია შემდეგი დასახელების ერთეულები:
:
1 მებიბაიტი (MiB) 1024 კიბ, 1048576=220 ბაიტი
ზე
1 გიბიბაიტი (GiB) 1024 მიბ, 1073741824=230 ბაიტი
ა
1024 გიბ, 1099511627776=240 ბაიტი
სტ
1 ტებიბაიტი (TiB)
ა!
ო
1 ეგზაბიბაიტი (EiB) 1024 პიბ, 1152921504606846976=260 ბაიტი
სი
ფ
1 ძებიბაიტი (ZiB) 1024 ეიბ, 1180591620717411303424=270 ბაიტი
ge
.
1 იობიბაიტი (YiB) 1024 ძიბ, 1208925819614629174706176=280 ბაიტი
ელ
ვე
u.
1 კილობაიტი (KB) 1000 ბ, 1000=103 ბაიტი
ო
ed
თ
1000 კბ, 1000000=106 ბაიტი
შა
1 მეგაბაიტი (MB)
ე
u.
ერ
1 გიგაბაიტი (GB) 1000 მბ, 1000000000=109 ბაიტი
მუ
bt
1 ტერაბაიტი (TB) 1000 გბ, 1000000000000=1012 ბაიტი
მწ
სა
vi
sh
ra
ეს
= 1030 ბაიტი.
ნი
≈3 კბ
ხო
4
1 წუთიანი მაღალ ხარისხში ჩაწერილი ხმა ≈15 მბ
1 წუთიანი მაღალ ხარისხში5 ჩაწერილი ვიდეო ≈10 გბ
6
ადამიანის 1 დნმ -ის მოლეკულა 750 მბ
135
სანამ ზომის მიხედვით დავიწყებთ ფაილების ძებნას, მანამდე ვნახოთ, როგორ შეიძ-
ლება ფაილების ზომის ნახვა shell-ში. თუ კარგად დავაკვირდებით ls -l ბრძანების შედეგს,
აღმოვაჩენთ, რომ მე-5 სვეტში სწორედ ფაილის ზომაა მოცემული ბაიტებში.
achiko@debian:∼$ ls -l
:
...
ზე
-rw-r--r-- 1 achiko achiko 5447 Oct 5 2013 Tux.jpg
-rw-r--r-- 1 achiko achiko 53 Jun 13 17:57 versions.txt
ა
drwxr-xr-x 2 achiko achiko 4096 Oct 6 2017 Videos
სტ
ფაილების ზომის გასაგებად მართებულია du (Disk Usage) ბრძანება გამოვიყენოთ.
ა!
ო
როგორც ამ ბრძანების სახელიდან ჩანს, ის გვანახებს თუ რა ზომა დაიკავა ამ ფაილმა დისკზე.
სი
ფ
ყურადღება მივაქციოთ იმას, რომ ფაილის ზუსტი ზომა და ის, თუ რა ზომა დაიკავა ამ ფაილმა
დისკზე, შეიძლება განსხვავდებოდეს (ამ საკითხებს უფრო დეტალურად ფაილური სისტემის
ge
განხილვისას დავუბრუნდებით). მოვიყვანოთ მაგალითები.
.
ელ
du * ბრძანება გვანახებს რამდენი ბლოკი დაიკავა დისკზე მიმდინარე დირექტორიის
”
ვე
u.
ფაილებმა. du * ბრძანებისთვის ბლოკის ზომად, ნაგულისხმევი მნიშვნელობით, 1024 ბაიტი
მოიაზრება თუ ის ხელით არ არის განსაზღვრული (მაგალითად shell-ში DU BLOCK SIZE გარე-
ო
ed
თ
მოს ცვლადით ან თავად ბრძანებაში --block-size ოფციით).
შა
u.
ერ
achiko@debian:∼$ du *
მუ
...
bt
8 Tux.jpg
მწ
სა
li@
4 versions.txt
მო
4 Videos
ის
vi
versions.txt ფაილი რომ განვიხილოთ, დავინახავთ, რომ დისკზე მას 4 ბლოკი, ანუ
ბი
არ
4*1024=4096 ბაიტი აქვს დაკავებული, მაშინ, როდესაც თავად ფაილის ზომა გაცილებით პა-
sh
ტარა, 53 ბაიტია.
ნე
შვ
ba
achiko@debian:∼$ du -b *
ნი
...
liz
5447 Tux.jpg
შე
53 versions.txt
e
4096 Videos
il.
ვთ
ნისთვის უფრო გასაგებ ფორმატში (human readable). -s-ით თითოეული არგუმენტის ჯამური
გთ
ზომა გამოგვაქვს.
ეს ბრძანება გამოიტანს პირადი დირექტორიის ჯამურ ზომას:
4
Sample rate: 44,1 kHz(CD), Bit rate: 8 bit, channels: 2 (Stereo), შეუკუმშავი (მაგალითად wav, aiff ან სხვა).
5
Resolution:1920x1080, Frame rate: 23.98, Uncompressed 1080 10-bit. FHD (Full High Definition)
6
დნმ - დეზოქსირიბონუკლეინის მჟავის ცოცხალ ორგანიზმები ინახავს გენეტიკურ კოდს
136
achiko@debian:∼$ du -sh ∼
36M /home/achiko
:
ზე
achiko@debian:∼$ du -sbc ∼/*
...
ა
5447 /home/achiko/Tux.jpg
სტ
53 /home/achiko/versions.txt
4096 /home/achiko/Videos
ა!
ო
60609 total
სი
ფ
დავუბრუნდეთ find ბრძანებას.
ge
.
როდესაც ფაილების ზუსტი ზომა არ ვიცით და გვსურს მისი მოძებნა ზომის მიხედვით,
ელ
ვე
შეგვიძლია + ან - ნიშანი ვიხმაროთ, რომელიც მოცემულ ზომაზე მეტს ან ნაკლებს ნიშნავს
u.
მოძებნის პროცესში.
ო
ed
თ
achiko@debian:∼$ find ∼ -type f -size +1M
შა
u.
ერ
მუ
bt
მწ
სა
li@
achiko@debian:∼$ find ∼ -type f -size 504c
მო
ის
ეს მოგვიძებნის ზუსტად 504 ბაიტის ზომის ფაილებს, თუ, რა თქმა უნდა, ასეთი მოგვე-
vi
პოვება.
ბი
არ
sh
ნე
შვ
ba
იკავებენ. ანუ რომელთა ზომები 4*512=2048 ბაიტსა და 5*512=2560 ბაიტს შორისაა წარმოდ-
liz
137
-user username მიესადაგება ყველა იმ ფაილს, რომლის მფლობელი არის username.
-group groupname მიესადაგება ყველა იმ ფაილს, რომლის მფლობელის ჯგუფი არის
groupname.
-perm mode აღნიშნავს ყველა ფაილს, რომლზე წვდომის უფლებებიც ემთხვევა მი-
თითებული mode-ს. mode-ის ჩაწერა, როგორც chmod ბრძანების შემ-
:
ზე
თხვევაშიი, 2 სახითაა შესაძლებელი: ციფრული ან სიმბოლური.
ა
მაგალითები მოვიყვანოთ:
სტ
ა!
achiko@debian:∼$ find . -perm 664
ო
სი
ფ
შეესაბამება ყველა იმ ფაილს, რომელსაც მხოლოდ 644 უფლება აქვს, ანუ მფლობელსა
ge
და მის ჯგუფს აქვთ კითხვისა და ჩაწერის უფლება და სხვა მომხმარებელს მხოლოდ წაკითხვის
.
ელ
უფლება.
ვე
u.
achiko@debian:∼$ find . -perm u=rw,g=r,o=r
ო
ed
თ
შა
ე
ეს იდენტური ბრძანებაა, მხოლოდ სიმბოლური ჩანაწერით.
u.
ერ
მუ
bt
achiko@debian:∼$ find . -perm -664
მწ
სა
li@
მო
შეესაბამება ყველა იმ ფაილს, რომელსაც მინიმუმ 644 უფლება აქვს. ანუ მფლობელსა
ის
და მის ჯგუფს აქვთ მინიმუმ კითხვისა და ჩაწერის უფლება და სხვა მომხმარებელს მინიმუმ
vi
კითხვის უფლება. აქ შესაძლებელია სხვა უფლებებიც ჰქონდეს ფაილს. მაგალითად, 777 კრი-
ბი
არ
ra
შვ
ba
მფლობელს აქვს ან მისი ჯგუფის წევრებს. სხვა მომხმარებლებს კი მხოლოდ კითხვის (4) უფ-
liz
ლება.
შე
e
il.
ch
მოძებნის ყველა ფაილს რომლის კითხვაც ყველას შეუძლია (-perm -444), ცვლილების
ხო
138
ახლა ისეთი კრიტერიუმები განვიხილოთ, რომლებიც ფაილის დროის მახასიათებლებს
(timestamp) იყენებს. ლინუქსში ფაილს სულ 4 დროითი მახასიათებელი აქვს:
:
ზე
atime ფაილის შიგთავსის წაკითხვის ბოლო თარიღი. ის ავტომატურად განახლდება მას
შემდეგ, რაც ფაილს წავიკითხავთ (მაგ: cat file). მის სანახავად შეგვიძლია ls
ა
სტ
-lu გავუშვათ.
ctime ფაილის მეტამონაცემის ბოლო ცვლილების თარიღი. ის ავტომატურად განახლდე-
ა!
ო
ბა მას შემდეგ, რაც ფაილს შეეცვლება უფლებები ან მფლობელი ან სახელი და ა.შ.
(მაგ. chmod 644 file). მას ls -lc ბრძანებით ვნახავთ.
სი
ფ
crtime ფაილის შექმნის თარიღი. ეს მახასიათებელი მოგვიანებით დაემატა. შესაბამისად,
ge
.
find ბრძანება ძებნას ვერ უზრუნველყოფს ამ მახასიათებლის მიხედვით. ვერც ls
ელ
ვე
ბრძანებას გამოაქვს ეს მონაცემი. ამ საკითხს მოგვიანებით დავუბრუნდებით.
u.
როგორც გახსოვთ, წინა თავებში touch ბრძანებას ცარიელი ფაილების შესაქმნელად
ო
ed
თ
ვიყენებდით, თუმცა არ აღგვინიშნავს მისი მთავარი დანიშნულება. touch გამოიყენება სწორედ
შა
u.
ერ
მუ
bt
achiko@debian:∼$ ls -l test.txt
მწ
li@
achiko@debian:∼$ touch -m -t 201801020304 test.txt
მო
ის
vi
sh
ნე
achiko@debian:∼$ ls -l test.txt
ra
ეს
ba
”
liz
შე
ასე კი test.txt-ის atime-ს დავაყენებთ 2018 წლის 02 იანვრის 03:05-ზე. აქაც გადა-
ვამოწმოთ:
ch
ხო
ar
139
-mtime n მიესადაგება იმ ფაილებს, რომლებიც n*24 საათის წინ შეიცვალა. შე-
საძლებელია, აგრეთვე, -n ან +n გამოვიყენოთ n-ზე ნაკლების ან მეტის
აღსანიშნავად.
:
ზე
-mmin n მიესადაგება ყველა ფაილს, რომელთა შესაბამისი მახასიათებელიც n წუ-
თის წინ შეიცვალა. აქაც შესაძლებელია აგრეთვე -n ან +n გამოვიყენოთ
ა
-amin n
სტ
-cmin n n-ზე ნაკლების ან მეტის აღსანიშნავად.
-newer file მიესადაგება ყველა ფაილს, რომლის mtime-იც უფრო ახალია ვიდრე file-
ა!
ო
ის mtime.
სი
ფ
-anewer file მიესადაგება ყველა ფაილს, რომლის atime/ctime უფრო ახალია ვიდრე
-cnewer file file-ის mtime.
ge
.
ელ
ვე
u.
achiko@debian:∼$ find . -type f -mmin -60
ო
ed
თ
შა
ე
მოძებნის ყველა ფაილს, რომელიც შეიცვალა ბოლო 1 საათის (60 წუთის) განმავლო-
u.
ერ
ბაში.
მუ
bt
მწ
li@
მო
find ბრძანებას კიდევ ბევრი სხვა კრიტერიუმი აქვს. მათ სანახავად find-ის სახელ-
vi
sh
ra
ba
ნიშნება -a.
ch
-not ლოგიკურ უარყოფას აღნიშნავს და კრიტერიუმის წინ იწერება. მოკლედ ასე აღი-
ხო
ნიშნება !.
() - ფრჩხილებით რთული გამოსახულების დაჯგუფება შეგვიძლია. როგორც წესი, find
ar
140
ეს ბრძანება მოძებნის ჩვეულებრივი ტიპის ყველა ფაილს, რომლის სახელიც ან a-თი
იწყება ან b-თი.
ფრჩხილები რომ არ გამოვიყენოთ:
:
ზე
ეს ბრძანება მოგვიძებნის a-თი დაწყებულ ჩვეულებრივი ტიპის ყველა ფაილს ან b-თი
დაწყებულ ყველა ფაილს (აქ b-ზე დაწყებული დირექტორიაც შეიძლება მოიძებნოს)
ა
სტ
$ find ∼ \( -user 1000 \( -name "*box" -or -name "pu*" \) \) ! \( -path
ა!
".mozilla/*" -o -path ".cache/*" \)
ო
სი
ფ
ეს ბრძანება მოძებნის ყველა იმ ფაილს, რომელიც ეკუთვნის მომხმარებელს 1000 UID
ge
ნომრით და რომლის სახელიც მთავრდება box-ზე ან იწყება pu-ზე, და ამავდროულად, მის სრულ
.
ელ
დასახელებაში (იგულისხმება მისი PATH) არ შევა სიტყვა .mozila/ ან .cache/ (ამით გვსურს,
ვე
გამოვრიცხოთ .mozila/ და .cache/ დირექტორიებში ან მათ ქვედირექტორიებში არსებული
u.
ფაილები).
ო
ed
თ
find ბრძანებას, იმის გარდა, რომ სხვადასხვა კრიტერიუმებით ეძებს ფაილებს, შეუძ-
შა
u.
ერ
არსებობს უკვე განსაზღვრული ქმედებები, თუმცა ზოგადი, ტრადიციული გზა ამისთვის
მუ
ასეთია, find ბრძანებას ბოლოში შემდეგი ჩანაწერი უნდა გადავცეთ და ისე გავუშვათ:
bt
მწ
სა
li@
achiko@debian:∼$ find ... -exec cmd '{}' \;
მო
ის
vi
შვ
ba
liz
ch
141
ამ ბრძანებას პრაქტიკული დანიშნულება აქვს. ის მოძებნის ისეთ დირექტორიებს, რომ-
ლებსაც 777 უფლება აქვს (ყველას ყველა უფლება აქვს) და შეცვლის მას 755-ით (ამით, ჩვენს
გარდა, ყველას წავართმევთ ამ დირექტორიებში ცვლილებების გაკეთების უფლება).
:
ზე
წაშლის ყველა ცარიელ ფაილს /tmp-ში.
ა
სტ
$ find ∼ -type f -name "*.txt" -exec mv {} txt dir/ \;
ა!
ო
ეს ბრძანება გადაიტანს ყველა txt-ზე დამთავრებულ ფაილს პირადი დირექტორიიდან
txt dir/ დირექტორიაში (რა თქმა უნდა, ის უკვე უნდა არსებობდეს)
სი
ფ
რ
ge
.
$ find ∼ \( -type f -not -perm 0600 -exec chmod 0600 {} \; \) -or \( -type
ელ
d -not -perm 0700 -exec chmod 0700 {} \;
ვე
u.
ო
ed
ეს ბრძანება პირად დირექტორიაში არსებული ყველა ფაილისა და დირექტორიის უფ-
თ
ლებებს შეცვლის და მხოლოდ მფლობელს მისცემს მათზე წვდომის უფლებებს, სხვა დანარჩენს
შა
u.
ერ
find ბრძანების უფრო მეტი შესაძლებლობების სანახავად გაუშვით man find.
მუ
bt
მწ
სა
li@
12.3 split
მო
მოდით, ახლა ერთი საინტერესო ახალი ბრძანება - split შევისწავოთ. split ბრძა-
ის
vi
ნებით შეგვიძლია დიდი ფაილი ნაწილებად დავყოთ. ნაწილებად დაყოფა შეიძლება ზომით ან
ბი
არ
achiko@debian:∼$ ls -l
შვ
ba
რად დაერქმევა xaa, xab, xac ... მართლაც, თითოეული დანაყოფი 200 ბაიტის ზომისაა, ბოლო
ხო
142
-rw-r--r-- 1 achiko achiko 200 Jun 22 18:31 Danakopi_ab
-rw-r--r-- 1 achiko achiko 104 Jun 22 18:31 Danakopi_ac
:
ზე
achiko@debian:∼$ split -b200 -d lorem.txt Danakopi
achiko@debian:∼$ ls -l Danakopi*
ა
-rw-r--r-- 1 achiko achiko 200 Jun 22 18:33 Danakopi_00
სტ
-rw-r--r-- 1 achiko achiko 200 Jun 22 18:33 Danakopi_01
-rw-r--r-- 1 achiko achiko 104 Jun 22 18:33 Danakopi_02
ა!
ო
სი
ფ
split-ში დიდი ზომის მისათითებლად შესაძლებელია შემდეგი ზომის ერთეულების გა-
მოყენება (ამ ბრძანებაში გათვალისწინებულია 2-ისა და 10-ის ხარისხებიანი ზომის ერთეულე-
ge
.
ბი): K, M, G, T, P, E, Z და Y (2-ის ხარისხებისთვის), ხოლო KB, MB, GB, TB, PB, EB, ZB და YB
ელ
(10-ის ხარისხებისთვის).
ვე
u.
ო
ed
achiko@debian:∼$ split -b1M file
თ
achiko@debian:∼$ ls -l Danakopi*
შა
u.
ერ
მუ
bt
მწ
სა
sh
ra
შვ
ba
liz
e
il.
12.4 echo
ვთ
ch
ვნახეთ, მას გამოაქვს არგუმენტად გადაცემული ტექსტი (პირდაპირი გაგებით ექოსავით იქ-
ar
ცევა. რასაც გადასცემ, იმას ბეჭდავს ეკრანზე) და ცვლადის მნიშვნელობა. ისიც ვთქვით, რომ
ტექსტები შეიძლება შეიცავდეს სპეციალურ სიმბოლოებს (ე.წ. backslash-escaped characters.
გთ
ასე იმიტომ ჰქვია, რომ მის წინ \ სიმბოლოა წარმოდგენილი). ამ სიმბოლოების დატვირთვა
”
არა რომელიმე ასო-ნიშნის ეკრანზე გამოსახვა, არამედ იმ ფუნქციის შესრულებაა, რაც მისი
კოდის ქვეშ იგულისხმება. ამისთვის echo ბრძანებას -e ოფცია უნდა გადავცეთ.
143
backslash-escaped characters
:
ზე
\f ახალ გვერდზე გადასვლა და ამ სიმბოლოს შემდეგ არსებული ტექსტით ხაზის
დაწყება (ე.წ. form feed ან page break).
ა
სტ
\n ამ სიმბოლოს შემდეგ არსებული ტექსტის ახალ ხაზზე გადატანა (new line).
ა!
\t ჰორიზონტალური ტაბულაცია (horizontal tab).
ო
\v ვერტიკალური ტაბულაცია (vertical tab).
სი
ფ
\r ამ სიმბოლოს შემდეგ არსებული ტექსტის გადაწერა იმავე ხაზის დასაწყისიდან
ge
.
(carriage return).
ელ
\\ თავად \ სიმბოლო. ვე
u.
”
\Onnn 8 ბიტიანი ასო-ნიშანი, რომლის მნიშვნელობა რვაობით წარმოდგენაში არის
ო
ed
თ
nnn (3 რვაობითი სიმბოლო).
შა
\xHH ე
8 ბიტიანი ასო-ნიშანი, რომლის მნიშვნელობა თექვსმეტობით წარმოდგენაში
u.
ერ
არის HH (2 თექვსმეტობითი სიმბოლო).
მუ
bt
\uHHHH უნიკოდის (ISO/IEC 10646) ასო-ნიშანი, რომლის მნიშვნელობა თექვსმეტობით
მწ
სა
sh
ნე
ba
echo ბრძანებას -e უნდა გადავცეთ. მათ გარეშე მხოლოდ ამ კოდების აღმნიშვნელი ასო-
შე
ბოროტსასძლიაკეთილმან,არსებამისიგრძელია!
ხო
$
ar
7
bell code საკონტროლო კოდი თავდაპირველად გამოიყენებოდა პატარა ელეტრომექანიკურ ზარზე სიგნალის გა-
დასაცემად, ბეჭდვის დროს ხაზის ბოლოს მისანიშნებლად და ახალი შეტყობინების მოსვლისას.
144
$ echo -e "ბოროტსა \tსძლია \tკეთილმან, \nარსება \tმისი \tგრძელია!"
ბოროტსა სძლია კეთილმან,
არსება მისი გრძელია!
$
$ echo -e "ბოროტსა სძლია კეთილმან, \rარსება მისი გრძელია!"
არსება მისი გრძელია!ან,
:
$
ზე
$ echo -e "ბოროტსა სძლია კეთილმან, \cარსება მისი გრძელია!"
ბოროტსა სძლია კეთილმან, $
ა
სტ
მოდით, ახლა ვნახოთ თუ როგორ სრულდება echo ბრძანებით თვლის სხვადასხვა წარ-
ა!
ო
მოდგენაში მოცემული ASCII ასო-ნიშნების კოდები. ავიღოთ ascii-ს სახელმძღვანელო გვერ-
დიდან ასო-ნიშნების რვაობითი და თექვსმეტობითი კოდები და ვცადოთ:
სი
ფ
რ
ge
.
achiko@debian:∼$ man ascii
ელ
ASCII(7) Linux Programmer's Manual
ვე ASCII(7)
u.
NAME
ო
ed
თ
ascii - ASCII character set encoded in octal, decimal,
შა
and hexadecimal
ე
u.
ერ
მუ
DESCRIPTION
bt
ASCII is the American Standard Code for Information
მწ
სა
646-IRV.
vi
ბი
არ
sh
ra
შვ
ba
liz
145
ამ ცხრილიდან ჩანს, რომ A ასო-ნიშნის რვაობით კოდია 101 , ხოლო თექვსმეტო-
” ”
ბითი 41 . ვაჩვენოთ, თუ როგორ გამოიტანს ამ კოდს echo ბრძანება.
”
:
A
ზე
achiko@debian:∼$ echo -e "\0115\0111\0123\0110\0113\0101"
MISHKA
ა
სტ
ყველაფერი რიგზეა. ახლა, მოდით, უნიკოდის ცხრილიდან გამოვიტანოთ ქართული
ა!
ანბანური დამწერლობის ასო-ნიშნები. მასში მოცემულია როგორც მხედრული (თანამედრო-
ო
ვე ანბანი), ასევე ნუხსური (ხუცური, ნუსხა-ხუცური, კუთხოვანი) და ასომთავრული (ხუცური
სი
ფ
ასომთავრული, მრგვლოვანი) დამწერლობის სახეები. უნიკოდის ცხრილი შეგიძლიათ ნახოთ
https://unicode-table.com ვებ-გვერდზე ან https://unicode.org/charts/-ზე ან სხვაგან.
ge
.
ელ
ვე
u.
achiko@debian:∼$ echo -e "\u10A0 \u10A1 \u10A2 \u10A3 \u10A4"
Ⴀ Ⴁ Ⴂ Ⴃ Ⴄ
ო
ed
თ
achiko@debian:∼$ echo -e "\u10D0 \u10D1 \u10D2 \u10D3 \u10D4"
შა
ა ბ გ დ ე ვ
ე
u.
achiko@debian:∼$ echo -e "\u2D00 \u2D01 \u2D02 \u2D03 \u2D04"
ერ
მუ
ⴀ ⴁ ⴂ ⴃ ⴄ
bt
მწ
სა
li@
echo ბრძანებაში, -e ოფციისგან განსხვავებით, -E ოფცია, პირიქით, ბლოკავს სპე-
ციალური სიმბოლოების ფუნქციების შესრულებას. -n ოფცია ბოლო ახალ ხაზზე გადასვლის
მო
სიმბოლოს შლის.
ის
vi
ბი
არ
sh
ႫႨႸႩႠ
შვ
ba
liz
შე
echo-ს გარდა, გვაქვს იმავე ფუნქციის სხვა ბრძანებაც - printf. ის მოგვიანებით დაემა-
e
ობს და, შესაბამისად, მისი ეს შესაძლებლობა უფრო მეტად დაპროგრამების დროსაა გამოსა-
ch
ar
146
ბოროტსა
სძლია კეთილმან,
არსება მისი გრძელია!
12.5 xargs
:
ზე
როდესაც ერთი ბრძანების მეორსთან გადაბმა გვსურს, xargs ბრძანება ძალიან სა-
სარგებლო შეიძლება აღმოჩნდეს. ზოგადად, xargs კითხულობს მონაცემებს სტანდარტული
ა
სტ
შესასვლელიდან, ამუშავებს და მათზე ასრულებს მოცემულ ბრძანებას, ნაგულისხმევი მნიშ-
ვნელობით /bin/echo-ს. მოკლედ, შეგვიძლია ვთქვათ, რომ xargs თავად ქმნის ბრძანებათა
ა!
ხაზს.
ო
სი
ფ
achiko@debian:∼$ xargs
Gamarjoba,
ge
.
Georgia
ელ
Gamarjoba, Georgia
ვე
u.
ო
ed
თ
ასე, xargs-ს კლავიატურიდან გადავეცით მონაცემები (მონაცემების შეტანა Ctrl^d
შა
u.
რადგანაც სხვა ბრძანება მითითებული არ იყო, /bin/echo-თი ეკრანზე გამოვიდა ერთხაზიანი
ერ
მუ
ჩანაწერი.
bt
მსგავს შედეგს მივიღებთ შემდეგ მაგალითშიც:
მწ
სა
li@
მო
achiko@debian:∼$ ls | xargs
ის
ra
ეს
ba
liz
achiko _apt avahi backup bin colord daemon Debian-exim Debian-gdm dnsmasq
games geoclue gnats irc list lp mail man messagebus news nobody proxy pulse
ch
147
achiko@debian:∼$ echo ერთი ორი სამი ოთხი ხუთი | xargs -n 2
ერთი ორი
სამი ოთხი
ხუთი
:
ზე
საბამისად, ჯამში 3 ბრძანებათა ხაზი შეიქმნა.
ა
თუ xargs-ს სხვა ბრძანებას მივუწერთ, მის მიერ დამუშავებულ მონაცემებს ამ ბრძანე-
სტ
ბას გადავცემთ არგუმენტად. მოდით, კვლავ მაგალითებს მივმართოთ.
ა!
ო
achiko@debian:∼$ ls *.txt | xargs wc
სი
ფ
5 10 49 cities.txt
5 11 51 countries.txt
ge
.
...
ელ
12 12 53 versions.txt
ვე
u.
372 2149 14874 total
ო
ed
თ
ამ ბრძანებით მიმდინარე დირექტორიაში ვეძებთ txt გაფართოების მქონე ყველა ფა-
შა
u.
ერ
ის სათითაოდ გამოიტანს ყველა ფაილში შემავალი ხაზების, სიტყვებისა და ასო-ნიშნების რა-
მუ
ოდენობას.
bt
მწ
li@
მოვძებნოთ test დირექტორიაში მყოფი ის დირექტორიები, რომელთა სახელიც a ასო-
მო
”
ნიშნით იწყება და წავშალოთ ისინი. ასეთი ამოცანა მარტივად კეთდება მხოლოდ find ბრძანე-
ის
ra
ეს
achiko@debian:∼$ ls -l test
ba
total 12
ნი
ახლა კი წავშალოთ:
ar
გთ
148
achiko@debian:∼$ ls test
a3 a4
:
ზე
გადატანის სიმბოლოთი, როგორც ეს, ნაგულისხმევი მნიშვნელობით, -print ოფციის დროს
ხდება. ეს საშუალებას აძლევს სხვა ბრძანებებს სწორად აღიქვან ის ფაილები, რომელთა დასა-
ა
ხელებებშიც უხილავი ასო-ნიშნები (მაგალითად, ახალ ხაზზე გადასხვლა ან სხვა) შედის. xargs
სტ
ბრძანებამაც ისინი კორექტულად რომ აღიქვას, -0 ოფცია უნდა მივუთითოთ. ასე:
ა!
ო
achiko@debian:∼$ find test/ -type d -name "a*" -print0 | xargs -0 rm -rf
სი
ფ
achiko@debian:∼$ ls test
achiko@debian:∼$
ge
.
ელ
ვე
ახლა, შევეცადოთ ფაილ(ებ)ი ვაკოპიროთ ერთდროულად რამდენიმე დირექტორიაში.
u.
ო
ed
achiko@debian:∼$ cd test/ && mkdir d{1,2}; touch f{1,2}
თ
achiko@debian:∼$ ls -F
შა
d1/ d2/ f1 f2 ე
u.
ერ
achiko@debian:∼$ echo d1 d2 | xargs -n 1 cp -v f1 f2
მუ
bt
'f1' -> 'd1/f1'
მწ
li@
'f1' -> 'd2/f1'
მო
achiko@debian:∼$ ls d1
vi
f1 f2
ბი
არ
achiko@debian:∼$ ls d2
sh
f1 f2
ნე
ra
ეს
ba
”
ბრძანებათა ხაზზე არგუმენტის რაოდენობას აღნიშნავს.
liz
შე
ლითი:
ch
ხო
LICENSE.txt
გთ
149
LICENSE.txt:PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
LICENSE.txt:1. This LICENSE AGREEMENT is between the Python Software
...
:
”
ზე
თავსში ვეძებთ იმ ხაზებს, სადაც LICENSE გამოსახულება შედის.
”
ა
სტ
12.6 expand, unexpand
ა!
ო
სი
ფ
ლინუქსში ფაილების შიგთავსზე მუშაობისას, მათი დამუშავებისას შეიძლება ხშირად
შეგვხვდეს სიტუაცია, როდესაც ტაბულაციის ნაცვლად ცარიელ სიმბოლოს ვისურვებდით გვქო-
ge
.
ნოდა და პირიქით. ტექსტების დამუშავების ბევრი ბრძანებისთვის მნიშვნელოვანია სვეტებს
ელ
ვე
შორის გამყოფი ასო-ნიშნის ცოდნა. სწორედ ამიტომ, ლინუქსში არსებობს ბრძანება expand,
u.
რომელსაც ტექსტში გამოყენებული ტაბულაციების ცარიელ სიმბოლოდ გარდაქმნა შეუძლია.
ო
მოდით, მაგალითები მოვიშველიოთ. შევქმნათ ფაილი, სადაც გამოვიყენებთ ტაბულა-
ed
თ
ციებს. ხაზში სვეტებს შორის 1, 2 და 3 ცალი ტაბულაცია გვაქვს ჩასმული:
შა
u.
ერ
მუ
bt
one two three four
მწ
სა
li@
გადავაქციოთ ტაბულაციები გამოტოვების სიმბოლოდ:
მო
ის
vi
ra
ერთი შეხედვით, თითქოს შედეგი იგივეა, თუმცა ეს ასე არ არის. expand ბრძანება,
ეს
ba
ch
150
achiko@debian:∼$ expand test1.txt > test2.txt
achiko@debian:∼$ cat -A test2.txt
one two three four$
:
ზე
ტაბულაციებად. -a, --all ოფციით ყველა ცარიელ სიმბოლოს გადააქცევს ტაბულაციად.
ა
achiko@debian:∼$ unexpand -a test2.txt > test3.txt
სტ
achiko@debian:∼$ cat -A test{1,2,3}.txt
one^Itwo^I^Ithree^I^I^Ifour$
ა!
ო
one two three four$
სი
ფ
one^Itwo^I^Ithree^I^I^Ifour$
ge
.
ასე, ყველაფერი ნათლად გამოჩნდა.
ელ
ვე
სხვადასხვა ბრძანების დემონსტრირებისას სხვადასხვა სატესტო ფაილს ვქმნიდით
u.
ხოლმე. ყოველ ჯერზე ახალი ფაილი რომ არ შევქმნათ და ასე არ დავაბინძუროთ ჩვენი
”
დირექტორია, შეგვიძლია ძველი სატესტო ფაილები გამოვიყენოთ. უბრალოდ მასში ძველი შიგ-
ო
ed
თ
თავსი უნდა წავშალოთ და ახალი სასურველი შიგთავსი ჩავწეროთ. ფაილის შიგთავსის წაშლა
შა
ე
მარტივია. შეგვიძლია სასურველ ტექსტურ რედაქტორში (მაგალითად vi-ში) გავხსნათ ფაილი
u.
ერ
და ხელით წავშალოთ ის, თუმცა ძალიან დიდი ზომის ფაილის შემთხვევაში, ეს საქმე გაცილე-
მუ
ბით მეტ დროს წაიღებს, თუ მოკლე გზები არ იცით. მოდით, განვიხილოთ ისინი.
bt
მწ
li@
ნე მოწყობილობა სადაც, ძირითადად, არასასურველ შეტყობინებებს გადავამისამართებთ
”
მო
ყველაფერი იშლება. მოკლედ რომ ვთქვათ, მასში არაფერი წერია. შესაბამისად, შეგვიძლია,
vi
sh
ra
achiko@debian:∼$ ls -l test3.txt
ეს
ba
ნი
ar
achiko@debian:∼$ ls -l test3.txt
-rw-r--r-- 1 achiko achiko 1 Aug 15 17:03 test3.txt
თუმცა, ასე ფაილის შიგთავსი სრულიად არ განულდება, რადგან echo ბრძანების შეს-
რულება ღილაკზე დაჭერის ექვივალენტია, რომელიც ავტომატურად ახალ ხაზზე გადასვლას
151
იწვევს. ამის თავიდან ასაცილებლად შეგვიძლია, -n ოფცია გამოვიყენოთ:
:
ზე
vi რედაქტორში თუ გვაქვს გახსნილი ფაილი, მარტივად შეგვიძლია, ასე მოვიქცეთ:
ა
სტ
achiko@debian:∼$ vi test3.txt
~
ა!
ო
~
სი
ფ
~
:1,$d
ge
.
ელ
ვე
ერთ-ერთი სხვა ხერხი ასეთია: შეგვიძლია, ნებისმიერი ისეთი ბრძანება გამოვიყენოთ,
u.
რომელიც წარმატებით სრულდება და ეკრანზე არაფერს ბეჭდავს. ჩვენ მხოლოდ ამ ბრძანების
სტანდარტული გამოსასვლელის ფაილისკენ გადამისამართება დაგვჭირდება. ერთ-ერთი ასეთი
ო
ed
თ
ბრძანებაა : ან ბრძანება true.
”
შა
u.
ერ
achiko@debian:∼$ : > test3.txt
მუ
bt
achiko@debian:∼$ true > test3.txt
მწ
სა
li@
თუმცა, ფაილის შიგთავსის განულების ყველაზე მარტივი მეთოდი შემდეგია:
მო
ის
vi
sh
”
ra
გვსურს. ეს ბრძანებაა truncate. ის უფრო ზოგადი დანიშნულების არის, ვიდრე ჩვენ მიერ
შვ
ba
დასახული ამოცანა.
ნი
liz
ch
ხო
ვიძლია. truncate ბრძანება ქმნის ე.წ. Sparse8 ფაილებს. სწორედ ამიტომ არის, რომ truncate-
გთ
8
Sparse file არის ისეთი ფაილი, რომლის შიგთავსის დიდი ნაწილიც ცერიელია. ასეთი ფაილების დისკზე ეფექ-
ტიანად განსათავსებლად, მათი შიგთავსის ცარიელი ბაიტების შენახვის სანაცვლოდ, წარმოგდენილია მეტამონაცემი,
რომელიც დისკზე დამატებით ბლოკებს არ იკავებს.
152
12.7 fmt, nl
:
ზე
გულისხმევი მნიშვნელობით, ეს 75-ია (ქართული ტექსტისთვის
3-ჯერ ნაკლებია)
ა
-t, --tagged-paragraph უკეთესი კითხვადობისთვის გამოყოფს აბზაცს.
სტ
-s, --split-only უკეთესი კითხვადობისთვის გამოყოფს გრძელ ხაზებს.
ა!
ო
-u, --uniform-spacing აერთგვაროვნებს ტექსტს. სიტყვებს შორის სვამს მაქსიმუმ
სი
ფ
ერთ გამოტოვებას, ხოლო წინადადებებს შორის კი 2-ს.
ge
.
ელ
ვე
u.
ო
ed
თ
achiko@debian:∼$ cat lorem2.txt
შა
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla hendrerit
ე
u.
ერ
leo at dolor eleifend viverra. Proin arcu arcu, dictum sit amet interdum
მუ
bt
egestas felis. Nulla eleifend massa nec ipsum varius facilisis. Interdum
მწ
სა
sh
ra
შვ
153
achiko@debian:∼$ cat lorem.txt | nl
1 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
2 Nam ultricies elit at cursus iaculis.
3 Nunc suscipit lacus egestas ullamcorper efficitur.
...
achiko@debian:∼$ cat lorem.txt | nl -w1 # ნუმერაციის სვეტის პოზიციაა 1
:
1 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
ზე
2 Nam ultricies elit at cursus iaculis.
3 Nunc suscipit lacus egestas ullamcorper efficitur.
ა
...
სტ
achiko@debian:∼$ cat lorem.txt | nl -w4 # ნუმერაციის სვეტის პოზიციაა 4
1 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
ა!
ო
2 Nam ultricies elit at cursus iaculis.
სი
ფ
3 Nunc suscipit lacus egestas ullamcorper efficitur.
...
ge
.
achiko@debian:∼$ cat lorem.txt | nl -i5 # ნუმერაციის ინტერვალია 5
ელ
1 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
ვე
u.
6 Nam ultricies elit at cursus iaculis.
11 Nunc suscipit lacus egestas ullamcorper efficitur.
ო
ed
თ
16 Maecenas hendrerit sapien suscipit tincidunt egestas.
შა
...
ე
u.
ერ
მუ
bt
დზე ნახოთ.
მწ
სა
li@
მო
12.8 od
ის
vi
ლია, აგრეთვე, გამოვიყენოთ ათობითი (-i ოფციით) სისტემა, თექვსმეტობითი (-x ოფციით)
შვ
liz
0000014
il.
0000014
ხო
154
სხვადასხვა ფორმატში (-Ax თექვსმეტობითი, -Ao რვაობითი, -Ad ათობითი, -An პირველი სვე-
ტის გარეშე).
მოდით, ახლა შევიტანოთ ერთ-ერთი უხილავი სიმბოლო ფაილში და ვნახოთ, თუ რო-
გორ გამოისახება ის ეკრანზე ლინუქსის ბრძანებებით. მაგალითისთვის ავიღოთ იმავე ხაზის
დასაწყისზე გადასვლის სიმბოლო (carriage return, \r). ის უხილავი სიმბოლოა. თუ მისი ჩასმა
vi რედაქტორით გვსურს უნდა დავაჭიროთ Ctrl^v Ctrl^m კლავიშების კომბინაციას თანმიმ-
:
დევრობით. შედეგად ^M სიმბოლოებს დავინახავთ ტექსტში.
ა ზე
achiko@debian:∼$ vi invisible.txt
სტ
Gamarjoba Geor^Mgia
achiko@debian:∼$ cat invisible.txt
ა!
giaarjoba Geor
ო
სი
ფ
ფაილის შიგთავსის გამოტანისას შედეგიც შესაბამისი მივიღეთ. carriage return კოდი
ge
შესრულდა და რეალური შიგთავსის ნაწილი დაიფარა. სწორედ ასეთ დროს უნდა გამოვიყენოთ
.
ელ
od ბრძანება, რომ დავინახოთ ფაილის რეალური შიგთავსი.
ვე
u.
achiko@debian:∼$ cat invisible.txt | od -Ad -c
ო
ed
თ
0000000 G a m a r j o b a G e o r \r g
შა
0000016 i a \n
ე
u.
ერ
0000019
მუ
bt
მწ
აქ უკვე ჩანს, რომ მე-15 ბაიტში ნამდვილად carriage return კოდია ჩასმული.
სა
li@
cat -vet invisible.txt ბრძანებითაც შეგვეძლო იმის ნახვა, რომ ფაილში უხილავი სიმბო-
მო
sh
Gamarjoba Georgia
შვ
ba
e
il.
ch
ხო
Ga
ar
mar
გთ
jo
ba
Geor
gia
achiko@debian:∼$
155
$ printf "\014Ga\013mar\013jo\013ba \012Geor\013gia\n "| od -c
0000000 \f G a \v m a r \v j o \v b a \n G
0000020 e o r \v g i a \n
:
0000030
ზე
როგორც წესი, ტექსტურ რედაქტორებში ასო-ნიშნების ტექსტში შეყვანას შესაბამის
ა
ღილაკებზე დაჭერით ვახორციელებთ. თუმცა, როგორც ვნახეთ, შესაძლებელია სიმბოლოების
სტ
ჩაწერა მათი კოდური წარმოდგენის მითითებითაც. სწორედ ეს ხერხი გვაძლევს იმის საშუა-
ლებას, რომ უხილავი სიმბოლოები შევიტანოთ ტექსტში. vi რედაქტორში ეს მარტივად არის
ა!
ო
შესაძლებელი. ამისთვის საკმარისია, ვიცოდეთ სიმბოლოს კოდი რვაობით, თექვსმეტობით ან
სი
ფ
უნიკოდის წარმოდგენაში. მაგალითისთვის ავიღოთ ვერტიკალური ტაბულაცია. მისი რვაობითი
კოდია 013, თექვსმეტობითი 0B, ხოლო უნიკოდში კი წარმოდგენილია 000B კოდით. vi რე-
ge
დაქტორში Ctrl^v კლავიშების კომბინაციის შემდეგ უნდა ავკრიფოთ o + 013Oct (რვაობითი
.
ელ
წარმოდგენის კოდი) ან x + OBHex (თექვსმეტობითის კოდი) ან u + OOOBU (უნიკოდის
ვე
u.
კოდი) კომბინაცია.
მოდით, ვცადოთ. ავიღოთ კვლავ invisible.txt ფაილი და Gamarjoba Georgia
”
ო
ed
თ
ხაზში, Ga -ს შემდეგ ავკრიფოთ Ctrl^v + o + 013Oct , mar -ს შემდეგ Ctrl^v + x +
” ”
შა
u.
cat ბრძანებით მისი შიგთავსის ნახვისას კი ეს კოდები შესრულდება:
ერ
მუ
bt
achiko@debian:∼$ vi invisible.txt
მწ
სა
li@
Ga^Kmar^Kjo^Kba Georgia
მო
vi
mar
ბი
არ
jo
sh
ba Georgia
ნე
ra
ეს
ba
liz
შე
achiko@debian:∼$ date
ar
გთ
ამ ბრძანებამ გამოიტანა კვირის დღე, თარიღი, დრო, დროის სარტყელი და წელი. მარ-
თალია, ამ ბრძანებას ტექსტების დამუშავებასთან დიდი არაფერი საერთო არ აქვს, მაგრამ ის
ხშირად გამოიყენება ფაილის დასახელების განსაზღვრისას. ძალიან მოსახერხებელია, როდე-
საც ფაილის დასახელებაში მისი შექმნის დრო შედის. date-ის სხვადასხვა ფორმატით არგუმენ-
ტის გადაწოდებით დროის ცალკეული ელემენტების გამოტანა შეგვიძლია. მხოლოდ მიმდინარე
156
წელი, თვე, საათი და ა.შ.
მოდით ვნახოთ რამდენიმე ელემენტი, რისი გამოტანაც შეუძლია ამ ბრანებას:
%H მიმდინარე საათი.
%M მიმდინარე წუთი.
:
%S მიმდინარე წამი.
ზე
%a კვირის დღე (შემოკლებული ფორმით).
ა
%B თვის სახელი (შემოკლებული ფორმით).
სტ
%d თვის დღე (1..31 ფორმატით).
ა!
ო
%m თვე (1..12 ფორმატით).
სი
ფ
%j წლის დღე (1..365 ფორმატით).
ge
%Y მიმდინარე წელი.
.
ელ
%s
ვე
ეპოქიდან9 გასული წამების რაოდენობა.
u.
ამ ელემენტების გამოტანისას წინ აუცილებლად + ნიშანი უნდა წარუმძღვაროთ. ასე:
ო
ed
თ
”
შა
u.
achiko@debian:∼$ date +%Y # მხოლოდ მიმდიმარე წელი გამოგვაქვს
ერ
მუ
2018
bt
achiko@debian:∼$ ps aux > process $(date +%Y%m%d%H%M%S).txt
მწ
სა
achiko@debian:∼$ ls
li@
...
მო
process_20180727162943.txt
ის
vi
ბი
არ
ლის დასახელებაში შესაბამისი დრო არის მოცემული: წელი, თვე, რიცხვი, საათი, წუთი და
ნე
წამი.
ra
ეს
ან შემდეგ. მაგალითად:
ba
ნი
Monday
ხო
ar
Universal Time) დრო. სადღეისოდ UTC დროის სტანდარტად არის აღიარებული. მისი წი-
ნანდელი სტანდარტი იყო გრინვიჩის მერიდიანის დრო (GMT (Greenwich Mean Time), ახლა
GMT მხოლოდ დროის სარტყელს წარმოადგენს. UTC დრო სინქრონიზირდება საერთაშორისო
9
Unix-ის მსგავს სისტემებში ოპოქა არის Unix ოპერაციული სისტემის შექმნის დროს დროის ათვლის საწყისი
წერტილი. ათვლა იწყება 1970 წლის 1 იანვრიდან წამებით. ეპოქა ცნობილია სხვა ტერმინებითაც, როგორიცაა: POSIX
დრო ან Unix-ის დრო.
157
ატომურ დროზე, რომელიც დაფუძნებულია 400 მაღალი სიზუსტის ატომურ საათზე და ასტრო-
ნომიულ დროზე, რომელიც, თავის მხრივ, დაფუძნებულია მზის სისტემაში დედამიწის ტრიალ-
ზე.
achiko@debian:∼$ date -u
Fri Jul 27 13:13:04 UTC 2018
:
achiko@debian:∼$ date
ზე
Fri Jul 27 17:13:05 +04 2018
ა
სტ
date ბრძანებით შესაძლებელია დროის შეცვლა კომპიუტერზე. თუმცა, ამისთვის ადმი-
ნისტრატორის უფლებებია საჭირო. ახალი დასაყენებელი დრო არგუმენტად ასეთი ფორმატით
ა!
უნდა გადავცეთ: MMDDhhmmYY[.ss] (თვე,დღე,საათი,წუთი,წელი,.წამი), წამების სიზუსტე ნე-
ო
ბაყოფლობითია და შეგვიძლია, არ მივუთითოთ. ამას გარდა, ბევრი სხვაგვარი ფორმატის მი-
სი
ფ
თითებაც შესაძლებელია.
ge
.
ელ
achiko@debian:∼# date 010214152015.34
Fri Jan 2 14:15:34 +04 2015 ვე
u.
ო
ed
თ
date ბრძანების გარდა, დროის დასაყენებლად სხვა ხერხებიც არსებობს. ზოგადად,
შა
u.
ერ
cal ბრძანებით მიმდინარე თვის კალენდარი გამოდის ეკრანზე. მთლიანი წლის კალენ-
მუ
დრის ნახვა -y ოფციით არის შესაძლებელი. თუ კონკრეტული წლის კალენდრის ნახვა გვსურს,
bt
მაშინ არგუმენტად შესაბამისი წელი უნდა მივუთითოთ.
მწ
სა
li@
მო
achiko@debian:∼# cal
ის
July 2018
vi
Su Mo Tu We Th Fr Sa
ბი
არ
sh
1 2 3 4 5 6 7
8 9 10 11 12 13 14
ნე
15 16 17 18 19 20 21
ra
ეს
22 23 24 25 26 27 28
შვ
ba
29 30 31
ნი
1121
შე
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
il.
ვთ
1 1 2 3 4 5 1 2 3 4 5
2 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 12
ch
9 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 19
ხო
16 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 26
ar
23 24 25 26 27 28 29 27 28 27 28 29 30 31
გთ
30 31
158
3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11
10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18
17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25
24 25 26 27 28 29 30 29 30 31 26 27 28 29 30
:
July August September
ზე
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 1 2 3 4 5 6 1 2 3
ა
3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10
სტ
10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17
17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24
ა!
ო
24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30
სი
ფ
31
ge
.
October November December
ელ
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
ვე
u.
1 1 2 3 4 5 1 2 3
2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10
ო
ed
თ
9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 17
შა
16 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 24
ე
u.
23 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 31
ერ
მუ
bt
მწ
სა
როგორც ჩანს, დიდგორის ბრძოლა (1121 წლის 12 აგვისტო) პარასკევ დღეს მოუგია
li@
დავით აღმაშენებელს :)
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
159
გთ
ხო
ვთ ეს
ar შე არ
ch ნი ის
შვ სა
il. ნე
eliz ბი მუ
შა
ba მო ო
ra მწ ვე
sh ერ რ
vi
li@ ე თ
სი
ა!
bt ელ
u. .
ფ
ed ო
u. სტ
ge აზე
:
თავი 13
:
ა ზე
რეგულარული გამოსახულება
სტ
ა!
ო
სი
ფ
მ თავში ჩვენ განვიხილავთ ტექსტებთან მანიპულირების ინსტრუმენტებს. როგორც უკ-
ge
.
ელ
სწორედ ასეთი ინსტრუმენტია რეგულარული გამოსახულება (regular expression, მოკ-
ვე
ლედ regexp ან regex). ის წარმოადგენს სტრუქტურულ ჩანაწერს, შაბლონს, რომელიც
u.
ტექსტებში გარკვეული ბლოკის გამოსაცნობად გამოიყენება. მისი შემადგენელი თითოეული
ო
ასო-ნიშანი ან მეტასიმბოლოა, რომელსაც სპეციალური მნიშვნელობა აქვს, ან ჩვეულებრივი
ed
თ
სიმბოლო, რომელსაც პირდაპირი მნიშვნელობა აქვს.
შა
ე
რეგულარული გამოსახულებები ხშირად გამოიყენება საძიებო სისტემებში, ტექსტურ
u.
ერ
რედაქტორებში, ლექსიკულ ანალიზში, და ზოგადად, დაპროგრამების ბევრ ენაში ტექსტებთან
მუ
bt
სამუშაოდ. ლინუქსში ბრძანებათა ხაზის ბევრ ბრძანებას აქვს რეგულარული გამოსახულების
მწ
li@
ფერი ჰგავს ბრძანებათა ხაზში ჩვენთვის უკვე კარგად ნაცნობ მაგენერირებელ სიმბოლოებს,
მო
შემოვიფარგლებით.
ნე
ra
ეს
13.1 grep
შვ
ba
გულარულ გამოსახულებებს იყენებს, არის ბრძანება grep. მისი დასახელება მოდის global
liz
”
regular expression print -დან. grep-ით შეგვიძლია მოვნახოთ მისი სტანდარტული შესასვლე-
შე
დირექტორიიდან.
ch
ხო
achiko@debian:∼$ cp /usr/share/common-licences/GPL-3 .
ar
161
უკეთესი ხილვადობისთვის შეგვიძლია მოსაძებნ გამოსახულებას ეკრანზე გამოტანი-
სას გამოკვეთილი ფერი მივცეთ --color ოფციით. ასე უკეთ დავინახავთ და დავრწმუნდებით,
რომ ხაზი გამოსახულებას შეიცავს.
:
The GNU General Public License is a free, copyleft license for
ზე
...
ა
სტ
ხშირად, ის სიტყვა, გამოსახულება, რომლის მოძებნაც გვსურს, ტექსტში ზოგგან დიდი
ასოებით არის მოცემული, ზოგგან პატარა ან შერეული ასოებით. თუ გვსურს, რომ გამოსა-
ა!
ხულება მოვძებნოთ ისე, რომ მის დიდ და პატარა ასოებს ყურადღება არ მიექცეს, მაშინ -i
ო
(--ignore-case) ოფცია უნდა გამოვიყენოთ.
სი
ფ
რ
ge
achiko@debian:∼$ grep --color -i "license" GPL-3
.
ელ
GNU GENERAL PUBLIC LICENSE
ვე
of this license document, but changing it is not allowed.
u.
The GNU General Public License is a free, copyleft license for
ო
ed
...
თ
შა
u.
როგორც ვხედავთ, ამ ბრძანებამ გამოგვიტანა ის ხაზები, სადაც license ჩაწერილია
ერ
მუ
bt
მწ
სა
li@
დიდ ტექსტში გამოსახულების მოძებნისას ხშირად სასარგებლოა, ვიცოდეთ იმ ხაზე-
მო
sh
10: The GNU General Public License is a free, copyleft license for
შვ
...
ნი
liz
ch
ar
შემდეგ 3 ხაზს.
162
achiko@debian:∼$ grep -C3 GNU GPL-3
:
ზოგ შემთხვევაში, შეიძლება გამოსახულების გამორიცხვა დაგვჭირდეს ხაზებიდან.
ზე
ანუ, იმ ხაზების მოძებნა, რომლებიც, პირიქით, არ შეიცავენ მოსაძებნ გამოსახულებს. -v
(--invert-match) ოფციით სწორედ შებრუნებული ხაზები გამოვა.
ა
სტ
achiko@debian:∼$ grep -v GNU GPL-3
ა!
ო
სი
როგორც ვთქვით, ეკრანზე გამოტანილი არცერთი ხაზი არ შეიცავს GNU გამოსახულე-
ფ
ბას.
ge
.
რიგ შემთხვევებში, უფრო მეტად ხაზების რაოდენობა გვაინტერესებს და არა თვითონ
ელ
ის ხაზები, რომლებიც ამ გამოსახულებას შეიცავენ. ასეთ სიტუაციაში, შეგვიძლია, ხაზები wc
ვე
u.
ბრძანებას დავათვლევინოთ, თუმცა grep-ის -c (--count) ოფცია უზრუნველყოფს ხაზების
რაოდენობას დათვლას.
ო
ed
თ
შა
u.
ერ
19
მუ
bt
მწ
li@
თავსში, არამედ იმდენში, რამდენ ფაილსაც გადავცემთ ბრძანებას არგუმენტად.
მო
ის
...
ბი
არ
sh
ra
GPL-3:the library. If this is what you want to do, use the GNU Lesser
ეს
შვ
...
ba
ნი
163
რეკურსიული ძებნისთვის -R ოფციის გამოყენებაც შეგვიძლია. განსხვავებით -r-სგან,
-R-ით მალსახმობშიც მოიძებნება.
ასეთი მიდგომით, grep ბრძანება ეკრანზე გამოიტანს ამ გამოსახულების შემცველ ხა-
ზებს, შესაბამისი ფაილის დასახელებებთან ერთად. შედეგად, გამოსავალი გადატვირთული
იქნება. ამიტომ შეგვიძლია, მხოლოდ ფაილების სიის გამოტანით შემოვიფარგლოთ. ამისთვის
-l (--file-with-matches) ოფცია უნდა გამოვიყენოთ.
:
ზე
achiko@debian:∼$ grep -Rl GNU .
...
ა
./TXT/foobar.txt
სტ
./LICENSE.txt
./GPL-3
ა!
ო
...
სი
ფ
-w ოფციის გამოყენებით შეგვიძლია, მოვძებნოთ ის ხაზები, რომლებიც კონკრეტულ
ge
.
სიტყვას შეიცავს.
ელ
ვე
u.
achiko@debian:∼$ grep -w ipsum lorem.txt
ო
ed
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
თ
Praesent sollicitudin ipsum vel pharetra gravida.
შა
u.
ერ
მუ
bt
რანზე -w ოფციის გარეშეც გამოვიდოდა, თუმცა დამატებით ის ხაზებიც გამოვა, სადაც ასო-
მწ
სა
sh
GNU
ra
ეს
GNU
შვ
GNU
ba
...
ნი
liz
ერთი შეხედვით, ახალი არაფერი მივიღეთ, ეკრანზე გამოვიდა მხოლოდ მოსაძებნი გა-
შე
დავიწყოთ!
ar
გთ
164
ძირითადი რეგულარული გამოსახულების (BRE) მეტასიმბოლოები
:
ზე
მაგ: Mishka$ იმ ხაზებს აღნიშნავს, რომლებიც Mishka-ზე მთავრდბა.
ა
სტ
მაგ: M.shka-ს შეიძლება შეესაბამებოდეს Mishka, Mashka და ა.შ.
ა!
* ეს მეტასიმბოლო შეიძლება მიეწეროს ნებისმიერ ასო-ნიშანს და ის ამ სიმბოლოს ნულ-
ო
ჯერ ან ბევრჯერ გამეორებას ნიშნავს.
სი
ფ
მაგ: ab*c გამოსახულებით მოიძებნება: abc, abbc, abbbc ... და ac-ც, რადგან b*, რო-
ge
.
გორც აღვნიშნეთ, b-ს ნულჯერ გამოერებასაც ნიშნავს.
ელ
\
ვე
ეს სიმბოლო, როგორც ზოგადად შელში, უკარგავს მნიშვნელობას მეტასიმბოლოებს.
u.
მაგ: tree\. მოძებნის tree.-ს და არა trees, რადგან წერტილმა დაკარგა თავისი მნიშ-
ო
ed
თ
ვნელობა და როგორც ჩვეულებრივი სიმბოლო ისე აღიქმება.
შა
\N ე
ეს ჩანაწერი, სადაც N რიცხვია, მე-N მონიშნულ ქვეგამოსახულებს ნიშნავს რეგულა-
u.
ერ
რულ გამოსახულებაში.
მუ
bt
[] კვადრატულ ფრჩხილებში წარმოდგენილ ასო-ნიშნებიდან ის აღნიშნავს ერთ-ერთს.
მწ
სა
li@
მაგ: [abc]–თი აღინიშნება ან a, ან b და ან c. კვადრატული ფრჩხილებით, როგორც უკვე
მო
სით. მაგ: ინტერვალი [b-g] აღნიშნავს b-დან g-ს ჩათვლით ერთ-ერთ სიმბოლოს. კვად-
vi
sh
გარდა, სხვა ასო-ნიშნებს აღნიშნავს. მაგ: [^abc] a-ს, b-სა და c-ს გარდა, სხვა ასო-
ნიშნებს გულისხმობს. ასე რომ, ყურადღება მიაქციეთ, რომ კვარდატულ ფრჩხილებსა
ნე
ba
ნი
liz
ციფრები.
ch
[:digit:]
ხო
[:upper:][:lower:].
გთ
[:alnum:] ლათინური ანბანის დიდი და პატარა ასოები და ციფრები. იგივეა, რაც [0-9A-
Za-z] ან [:alpha:][:digit:].
[:blank:] გამოტოვება და ტაბულაცია.
165
[:punct:] პუნქტუაციის ნიშნები. მასში შედის შემდეგი სიმბოლოები: !"#$%&'()*+,-
./:;<=>?@[\]^ `{|}~
[:print:] ხილული სიმბოლოები. იგივეა, რაც [:graph:][:blank:].
:
[:xdigit:] თექვსმეტობითი სისტემის ასო-ნიშნები. იგივეა, რაც [0-9A-Fa-f].
ა ზე
იმისთვის, რომ grep ბრძანებას კლასი მივუთითოთ მისი შემადგენელი ერთ-ერთი სიმ-
სტ
ბოლოს მოსაძებნად, ეს კლასი, თავის მხრივ, კიდევ უნდა ჩავსვათ კვადრატულ ფრჩხილებში.
ასე: [[:lower:]], [[:digit:]] და ა.შ.
ა!
ო
სი
გაფართოებული რეგულარული გამოსახულების (ERE) მეტასიმბოლოები
ფ
+ ეს მეტასიმბოლო შეიძლება, მიეწეროს ნებისმიერ ასო-ნიშანს და ის ამ სიმბოლოს
ge
.
ერთხელ ან ბევრჯერ გამეორებას ნიშნავს.
ელ
ვე
u.
მაგ: ab*c-თი მოიძებნება: abc, abbc, abbbc. აქ გამოირიცხება ac.
ო
ed
? ეს მეტასიმბოლო შეიძლება, მიეწეროს ნებისმიერ ასო-ნიშანს და ის ამ სიმბოლოს
თ
ერთხელ ან ნულჯერ გამეორებას ნიშნავს.
შა
u.
ერ
მაგ: ab?c-ით მოიძებნება:abc და ac.
მუ
bt
. წერტილი აღნიშნავს ერთ ნებისმიერ ასო-ნიშანს.
მწ
სა
li@
მაგ: M.shka-ს შეიძლება, შეესაბამებოდეს Mishka, Mashka და ა.შ.
მო
vi
sh
ra
იგულისხმება a ან bc.
შვ
ba
{} ფიგურულ ფრჩხილებში რიცხვი იწერება და ასეთი ჩანაწერი მის წინ მდგომი ასო-
ნი
{n,} ასო-ნიშნის n-ჯერ ან მეტჯერ გამეორებაა. მაგ: a{2,} არის aa, aaa, aaaa ...
{,m} ასო-ნიშნის მაქსიმუმ m-ჯერ გამეორებაა. მაგ: ba{,3}b არის bb, bab, baab ან
il.
ვთ
baaab
ch
{n,m} ასო-ნიშნის n-დან m-ჯერ გამეორებაა. მაგ: a{2,4} არის aa, aaa ან aaaa
ხო
ყურადღება მიაქციეთ, რომ ასეთი ფორმა ეძებს წინ მიწერილი ერთი ასო-ნიშნის გა-
ar
166
\b, \B \b მეტასიმბოლოთი აღინიშნება სიტყვის კიდე. რეგულარულ გამოსახულებაში სი-
ტყვად მოიაზრება მხოლოდ ანბანის ასოები ან ციფრები და ან ქვედა ტირე ( ). \B
მეტასიმბოლოთი კი სიტყვის შუა ნაწილი აღინიშნება, და არა კიდე. მაგ:
:
დება სხვა ერთი ასო-ნიშნით.
ზე
\BMishka\b-თი ის სიტყვა, რომელიც იწყება რომელიმე ასო-ნიშნებით და აუცი-
ლებლად მთავრდება Mishka.
ა
\BMishka\B-თი ის სიტყვა, რომელიც აუცილებლად იწყება და მთავრდება რომე-
სტ
ლიმე ასო-ნიშნებით და შუალედში აუცილებლად არის წარმოდგენილი Mishka.
ა!
ო
\<, \> GNU-ს დამკვიდრებული ბრძანებებში, სიტყვის დაწყება-დამთავრების აღსანიშნა-
ვად, აგრეთვე გამოიყენება საკუთარი სინტაქსური ჩანაწერი. სწორედ ეს მეტასიმ-
სი
ფ
ბოლოები აღნიშნავენ GNU-ს სინტაქსში კიდეებს სიტყვის დასაწყისსა და ბოლოში.
ge
.
მაგ: \<word\> ნიშნავს სიტყვა word-ს. ამ სიმბოლოების ცალ-ცალკე ხმარებაც შე-
ელ
ვე
იძლება. \<word ნიშნავს სიტყვას, რომელიც იწყება word-ით და უნდა გაგრძელდეს
u.
სხვა სიმბოლოებით. word\> კი ნიშნავს სიტყვას, რომელიც მთავრდება word-ით
და უნდა იწყებოდეს სხვა სიმბოლოებით.
ო
ed
თ
შა
u.
გარდა ანბანის ასოების, ციფრებისა და ქვედატირესგან ( ), მაშინ მხოლოდ -w ოფ-
ერ
მუ
bt
მწ
სა
li@
მო
vi
ba
დაიმახსოვრეთ!
ნი
liz
ar
167
იმისთვის, რომ არ გამოვიყენოთ გაფართოებული რეგულარული გამოსახულება და შე-
ვინარჩუნოთ მიდგომა, ასეც შეგვიძლია ჩავწეროთ:
:
ზე
achiko@debian:∼$ cat test.txt | grep -i "linux"
ა
სტ
რადგან ეს ბრძანება გამოიტანდა ისეთ ხაზებსაც, რომლებიც შეიცავს მაგალითად
ა!
ო
LiNux-ს ან LINUX-ს და ა.შ.
სი
ფ
რ
ge
.
თუ პირობას ცოტა შევცვლით და მიზნად ისეთი ხაზების გამოტანას დავისახავთ, სადაც
ელ
შედის სიტყვა და არა გამოსახულება linux ან Linux, მაშინ ბრძანება მიიღებს შემდეგ სახეს:
ვე
u.
achiko@debian:∼$ cat test.txt | grep -w "[lL]inux"
ო
ed
თ
შა
u.
ან
ერ
მუ
bt
achiko@debian:∼$ cat test.txt | grep -Ew "(l|L)inux"
მწ
სა
li@
მო
ან
ის
vi
sh
ნე
ან
ra
ეს
შვ
ba
liz
ვთქვათ, გვსურს მოვძებნოთ სიტყვა \linux . აქ უკვე \b, \< და \> მეტასიმბოლოები
შე
”
აღარ გამოგვადგება. ისინი, ხომ სიმბოლო \ -ს სიტყვის შემადგენელ ასო-ნიშნად ვერ აღიქ-
”
e
ch
ar
168
$ echo "Here /usr/bin is not the word" | grep -E '\b/usr/bin\b'
$
:
ზე
ეს ბრძანებები კი ვერ მოძებნიან /usr/bin-ს, რადგან სიტყვაში / სიმბოლო შედის.
”
ა
ახლა მოვძებნოთ ხაზები, რომლებიც იწყება linux ან Linux-ით ან და unix ან Unix-ით.
სტ
ა!
achiko@debian:∼$ cat test.txt | grep -E '^((l|L)inux|(u|U)nix)'
ო
სი
ფ
დავითვალოთ ცარიელი ხაზები ფაილში:
ge
.
ელ
achiko@debian:∼$ cat test.txt | grep -c '^$'
ვე
u.
ო
ed
აქ ვითვლით იმ ხაზებს, რომლებიც დაწყებისთანავე მთავრდება. სხვა მიდგომითაც
თ
შეგვიძლია ეს ამოცანა ამოვხსნათ, ასე:
შა
u.
ერ
მუ
bt
მწ
სა
li@
. ხომ ნიშნავს ერთ ნებისმიერ ასო-ნისანს, -v ოფციით კი ის ხაზი გამოვა, სადაც ეს
”
მო
ასო-ნიშანი არ შედის, ანუ ცარიელი ხაზი. -c-თი კი დავითვლით ასეთი ხაზების რაოდენობას.
ის
sh
ra
ეს
ba
სიმბოლოებს (ასეთ ხაზში შეიძლება მოხვდეს ციფრიც. ხაზი ხომ, მის გარდა, სხვა სიმბოლოსაც
შეიცავს). -v კი ამ ხაზების ინვერსიას აკეთებს და, მათ ნაცვლად, დანარჩენ ხაზებს გამოიტანს
ნი
liz
ეს ბრძანება ცარიელ ხაზსაც გამოიტანს (თუ, რა თქმა უნდა, ასეთი ამ ფაილში არსე-
e
ch
ar
169
achiko@debian:∼$ cat test.txt | grep -w '\+9955[0-9]\{8\}'
:
ზე
$ ls -ARl $HOME | grep '^-' | tr -s ' ' | cut -f5 -d' ' | grep -c '^\.'
ა
სტ
განვმარტოთ!
ა!
ო
ჯერ რეკურსიულად გამოგვაქვს პირადი დირექტორიიდან ყველა ფაილის სია გრძელი
სი
ფ
ფორმატით, შემდეგ ვარჩევთ მხოლოდ ჩვეულებრივი ტიპის ფაილს (გრძელ ფორმატში მათი
შესაბამის ხაზები - -თი იწყება), შემდეგ გამოგვაქვს ფაილის დასახელებები (მე-9 სვეტშია
ge
.
”
ელ
განთავსებული). მე-9 სვეტი სწორად რომ გამოვიტანოთ, შევკვეცოთ სვეტებს შორის არსებული
ვე
მრავალი გამოტოვების სიმბოლო ერთი დაშორებით (სვეტებს შორის დაშორება არაერთგვარო-
u.
ვანია და შეიძლება მრავალ გამოტოვებას შეიცავდეს). შემდეგ კი, ფაილის დასახელებებიდან
ო
გამოვიტანოთ მხოლოდ ისინი, რომლებიც წერტილით იწყება. grep-ში რადგან . მეტასიმბო-
ed
თ
”
ლოს წარმოადგენს \ -ით ვუკარგავთ მის მნიშვნელობას.
შა
”
ე
u.
ერ
გამოვიტანოთ ის ხაზები, რომლების სწორად ჩაწერილ IP მისამართებს შეიცავენ:
მუ
bt
მწ
სა
vi
შემდეგი ფორმატი: +0.45, -4.2, .9 (0.9-ს ექვივალენტად), ხოლო 9. არა. წერტილის შემდეგ
sh
”
ერთი ციფრი მაინც უნდა მოდიოდეს.
ნე
ra
ეს
ba
ნი
grep ბრძანებას აქვს კიდევ ერთი სასარგებლო ოფცია -e. ის საშუალებას გვაძლევს
liz
მელშიც ერთ-ერთი გამოსახულება მაინც შედის. მოკლედ რომ ვთქვათ, ლოგიკური ან გამო-
”
e
ვიყენოთ.
il.
ვთ
ch
ar
170
achiko@debian:∼$ cat test.txt | grep -e 'linux' -e 'Unix' -e 'Solaris'
:
ზე
რომელიც შეიცავს ერთდროულად როგორც linux-ს, ასევე Unix-ს.
ა
ამ დროს ასე უნდა მოვიქცეთ:
სტ
achiko@debian:∼$ cat test.txt | grep 'Linux.*Unix'
ა!
ო
სი
ფ
ამ ბრძანებით ეკრანზე გამოვა ის ხაზები, რომლებშიც შედის Linux, შემდეგ ნებისმიერი
რაოდენობით გამეორებული ნებისმიერი ასო-ნიშანი და შემდეგ Unix. რა თქმა უნდა, შესაძლე-
ge
.
ელ
ბელია, ხაზში ჯერ Unix შედიოდეს და შემდეგ Linux. ზოგადი ჩანაწერი ასეთი იქნება:
ვე
u.
achiko@debian:∼$ cat test.txt | grep -E 'Linux.*Unix|Unix.*Linux'
ო
ed
თ
შა
ე
ლოგიკური და სხვა მიდგომითაც შეგვიძლია განვახორციელოთ, grep-ის რამდენ-
u.
”
ერ
ჯერმე გამოყენებით. ჩვენს მაგალითზე ეს ასე იქნება:
მუ
bt
მწ
სა
”
დაცემულ ფაილებში, ასე:
ნე
ra
ეს
ba
ნი
ყოფს სწორედ იმას, რომ ეს მეტასიმბოლოები აღქმულ იქნას მხოლოდ ჩვეულებრივ სიმბოლო-
ar
171
13.2 sed
:
ზე
ვი გამოყენებით საკმაოდ რთული ამოცანების გადაჭრაა შესაძლებელი. მისი შესაძლებლობები
იმითაც იზრდება, რომ მას რეგულარული გამოსახულების გაგება შეუძლია.
ა
sed ბრძანების სინტაქსი ასეთია:
სტ
$ sed 'commands' file1 file2 ...
ა!
ო
სი
ფ
ეს ბრძანება სტანდარტულ შესასვლელზე იღებს არგუმენტად გადაცემული ფაილ(ებ)ის
შიგთავსს, დაამუშავებს მათ ხაზ-ხაზ მოცემული ბრძანებებით (ეს ბრძანებები საკუთარ ინ-
ge
.
სტრუქციებს წარმოადგენს და არა შელის ბრძანებებს) და შემდეგ მიღებულ შედეგს გამოიტანს
ელ
სტანდარტულ გამოსასვლელზე, ეკრანზე.
ვე
u.
უფრო დეტალურად რომ აღვწეროთ, ეს ყველაფერი ასე ხდება:
ო
ed
თ
1. sed კითხულობს შესასვლელის პირველ ხაზს და განათავსებს მას გამოსახულების ბუ-
შა
ე
ფერში. გამოსახულების ბუფერი არის sed-სთვის მეხსიერებაში გამოყოფილი ადგილი.
u.
ერ
მუ
bt
2. sed დაამუშავებს მოცემული ბრძანებებით გამოსახულების ბუფერში შენახულ მონაცემს.
მწ
სა
li@
3. sed გამოიტანს დამუშავებულ მონაცემებს გამოსასვლელზე და გაასუფთავებს გამოსახუ-
მო
ლების ბუფერს.
ის
vi
4. შემდეგ sed მეორე ხაზზე გადავა და იგივე პროცედურებს გაიმეორებს. ეს ციკლი გაგ-
ბი
არ
ra
შვ
ში არსებული შიგთავსის შეცვლილი ვერსია გამოდის, ხოლო ფაილის შიგთავსი უცვლელი რჩე-
ba
ბა.
ნი
achiko@debian:∼$ vi test.txt
e
ch
მოდით, გავაანალიზოთ რატომ მივიღეთ ასეთი შედეგი: sed-მა აიღო ხაზი, დააკოპირა
ის გამოსახულების ბუფერში, რადგან ინსტრუქცია არ არის მითითებული, არ დაამუშავა ეს
მონაცემები და პირდაპირ გამოიტანა ეკრანზე.
ახლა კი, განვიხილოთ sed-ის ბრძანებები, რათა უკეთ გავიგოთ, თუ რა შეუძლია მას.
ავიღოთ ერთ-ერთი სატესტო ფაილი countries.txt
172
achiko@debian:∼$ cat countries.txt
1 Georgia
2 France
3 USA
4 Germany
5 Great Britain
:
ა ზე
13.2.1 წაშლა
სტ
ბრძანება d (delete) შლის სტრიქონებს გამოსახულების ბუფერში.
ა!
ო
სი
ფ
achiko@debian:∼$ cat countries.txt | sed 'd'
achiko@debian:∼$
ge
.
ელ
ვე
არაფერი გამოვიდა ეკრანზე. ეს შედეგი ნორმალურია. ჩვენ ხომ მივუთითეთ, რომ ყვე-
u.
ლა ხაზი წაეშალა.
ო
ed
sed, როგორც ვთქვით, ყველა ხაზს ჩამოუვლის და დაამუშავებს. თუმცა, შესაძლებე-
თ
ლია კონკრეტული ხაზების მისამართის მითითებაც. ხაზის მისამართი შეიძლება იყოს რიცხვი
შა
ე
ან გამოსახულება. რიცხვის მითითებით, sed ამ რიცხვის შესაბამის ნომრიან ხაზს გამოიტანს.
u.
ერ
გამოსახულების მითითებით, (ის აუცილებლად / -ებში უნდა მოვათავსოთ) sed გამოიტანს
მუ
bt
ხაზს, რომელიც ამ გამოსახულებს შეიცავს.
მწ
li@
ციაში გამოიყენება. მაგალითად, ყველა ხაზის წაშლის მაგივრად, შეგვიძლია, მივუთითოთ თუ
მო
sh
1 Georgia
ra
ეს
2 France
შვ
4 Germany
ba
5 Great Britain
ნი
liz
e
il.
1 Georgia
ch
5 Great Britain
ხო
ar
173
achiko@debian:∼$ sed '1∼2d' countries.txt
2 France
4 Germany
:
ზე
achiko@debian:∼$ sed '/erm/d' countries.txt
1 Georgia
ა
2 France
სტ
3 USA
5 Great Britain
ა!
ო
სი
ფ
წაშალოს ყველა ხაზი, იმ ხაზიდან დაწყებული, რომელიც ran გამოსახულებას შეიცავს,
იმ ხაზით დამთავრებული, რომელიც erm გამოსახულებას შეიცავს:
ge
.
ელ
achiko@debian:∼$ sed '/ran/,/erm/d' countries.txt ვე
u.
1 Georgia
ო
ed
თ
5 Great Britain
შა
u.
წაშალოს ხაზი, რომელიც erm გამოსახულებას შეიცავს და კიდევ შემდეგი 2 ხაზი:
ერ
მუ
bt
მწ
li@
1 Georgia
მო
2 France
ის
3 USA
vi
ბი
არ
sh
ra
ეს
შვ
ba
ნი
13.2.2 ჩანაცვლება
liz
შე
1 GeorgiXYZ
2 FrXYZnce
გთ
3 USA
4 GermXYZny
5 GreXYZt Britain
174
achiko@debian:∼$ sed 's/a/XYZ/2' countries.txt
1 Georgia
2 France
3 USA
4 Germany
5 Great BritXYZin
:
ზე
ასე, ხაზში ყველა შემხვედრი a შეიცვლება XYZ-ით:
ა
სტ
achiko@debian:∼$ sed 's/a/XYZ/g' countries.txt
1 GeorgiXYZ
ა!
ო
2 FrXYZnce
სი
ფ
3 USA
4 GermXYZny
ge
5 GreXYZt BritXYZin
.
ელ
ვე
u.
ასე კი, ხაზში მე-3 შემხვედრი a-დან დაწყებული ყველა a შეიცვლება XYZ-ით. უბრალოდ,
ჩვენს ფაილში ასეთი სამჯერ ან მეტჯერ გამოყენებული a ასო-ნიშანი ერთ ხაზში არ გვაქვს.
ო
ed
თ
შა
u.
ერ
1 Georgia
მუ
bt
2 France
მწ
3 USA
სა
li@
4 Germany
მო
5 Great Britain
ის
vi
sh
ra
ეს
1 GeorgiXYZ
ba
2 FrXYZnce
ნი
3 USXYZ
liz
4 GermXYZny
შე
5 GreXYZt BritXYZin
e
il.
ვთ
1 GeorgiaXYZ
2 FranceXYZ
გთ
3 USAXYZ
4 GermanyXYZ
5 Great BritainXYZ
175
achiko@debian:∼$ sed 's/^..//' countries.txt
XYZGeorgia
XYZFrance
XYZUSA
XYZGermany
XYZGreat Britain
:
ზე
გამოსახულების ჩანაცვლებისას, ამოცანიდან გამომდინარე, ხშირად სასარგებლოა
ა
მთლიანი ხაზი რეგულარული გამოსახულებით აღვწეროთ. ჩვენს შემთხვევაში ასეთი სურათი
სტ
გვაქვს. პირველ სვეტში გვაქვს რიცხვი მეორეში კი ქვეყნის დასახელება. რეგულარული გამო-
სახულებით ასეთი ხაზი ასე აღიწერება: [0-9][0-9]* ..* - ციფრს მინიმუმ ერთხელ მაინც
”
ა!
ვიმეორებთ (* სიმბოლო ხომ 0-ჯერ გამეორებასაც ნიშნავს. ამიტომ დავწერეთ ორჯერ ციფრი).
ო
შემეგ გამოტოვების ერთი სიმბოლო მოდის (სვეტებს შორის გამოყოფი სიმბოლო). ბოლოს კი
სი
ფ
ნებისმიერი სიმბოლოს გამეორება მინიმუმ ერთხელ.
შემდეგ კი, საკმარისია, ამ გამოსახულების ნებისმიერი მონაკვეთი \( \) სტრუქ-
ge
.
”
ტურაში მოვაქციოთ, რომ ეს მონაკვეთი sed-ის ცვლადში, \1 -ში დამახსოვრდება. თუ სხვა
ელ
”
ვე
მონაკვეთსაც ჩავსვამთ იგივე სტრუქტურაში, მაშინ მისი შიგთავსი \2 -ში ჩაიწერება და ა.შ.
u.
”
ამ ბრძანებით გამოვიტანთ მხოლოდ ქვეყნის დასახელებებს:
ო
ed
თ
შა
u.
ერ
Georgia
მუ
France
bt
USA
მწ
სა
Germany
li@
Great Britain
მო
ის
vi
ასე კი, ჯერ ქვეყნის დასახელებას (ის უკვე \2 ცვლადშია) გამოვიტანთ, ხოლო შემდგ
ბი
არ
ra
Georgia
შვ
ba
France
USA
ნი
liz
Germany
შე
Great Britain
e
il.
”
ერთ-ერთი მეტასიმბოლო + (ერთხელ ან ბევრჯერ გამეორება) შეგვიძლია, გამოვიყენოთ.
”
ch
176
დეგი სპეციალური სიმბოლოებიც \l, \L, \u, \U და &.
:
\U გამოსახულების ყველა ასო-ნიშანს დიდ ასოდ გადააკეთებს.
ზე
& ეს სიმბოლო sed-ში თვითონ შესაცვლელი გამოსახულების მოკლე აღნიშვნაა.
ა
სტ
ამ ბრძანებით ყველა ხაზის პატარა ასოებს გადავაკეთებთ დიდ ასოებად:
ა!
ო
achiko@debian:∼$ sed 's/.*/\U&/' countries.txt
სი
ფ
1 GEORGIA
2 FRANCE
ge
.
3 USA
ელ
4 GERMANY
ვე
u.
5 GREAT BRITAIN
ო
ed
თ
ასე, ქვეყნების სახელების პირველი ასო გამოვა პატარა ასოებით:
შა
u.
ერ
achiko@debian:∼$ sed 's/ \(.\)/ \l\1/' countries.txt
მუ
bt
1 georgia
მწ
2 france
სა
li@
3 uSA
მო
4 germany
ის
5 great Britain
vi
ბი
არ
sh
შვ
ba
(2 France)
liz
(3 USA)
შე
(4 Germany)
e
5 Great Britain
il.
ვთ
ch
ბენ ხოლმე. თუმცა, მის ნაცვლად ნებისმიერი სიმბოლოს გამოყენებაც შესაძლებელია. ყველა
ar
177
achiko@debian:∼$ echo "xyz" | sed 's!x!A!'
Ayz
achiko@debian:∼$ echo "xyz" | sed 's:x:A:'
Ayz
achiko@debian:∼$ echo "xyz" | sed 'sTxTAT'
Ayz
:
achiko@debian:∼$ echo "xyz" | sed 'sbxbAb'
ზე
Ayz
ა
სტ
ასეთი ხერხი საშუალებას გვაძლევს, გამოსახულებაში არსებული სიმბოლოების გარ-
და, ჩანაცვლების ბრძანებაში სხვა სიმბოლო გამოვიყენოთ. შესაცვლელი გამოსახულება თუ
ა!
ო
ბევრ / -ს შეიცავს, უმჯობესია, მოვერიდოთ / -ის გამოყენებას და მის ნაცვლად, მაგალი-
” ”
თად, @ სიმბოლო გამოვიყენოთ. ასე, მაგალითად:
სი
ფ
”
ge
.
achiko@debian:∼$ echo $PATH | sed 's@/usr/local2/bin@/opt/local/bin@'
ელ
ვე
u.
თუ მაინცდამაინც / -ის გამოყენება გვსურს, მაშინ მას წინ \ უნდა მივუწეროთ. ასე:
” ”
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
სა
li@
13.2.3 დაბეჭდვა
მო
ის
sh
Georgia
ra
ეს
Georgia
შვ
ba
liz
აქვს გამოსახულების ბუფერში გადატანილი ხაზი. იმისათვის, რომ ხაზის ავტომატური გამო-
e
ar
3 USA
4 Germany
ასე, მხოლოდ ის ხაზი გამოვა, რომელშიც შედის Geo გამოსახულება. ეს ბრძანება grep-
ის ექვივალენტურია.
178
achiko@debian:∼$ sed -n '/Geo/p' countries.txt
1 Georgia
:
ზე
achiko@debian:∼$ sed -n '/Geo/!p' countries.txt
2 France
ა
სტ
3 USA
4 Germany
5 Great Britain
ა!
ო
სი
ფ
ასე კი, მე-2 და დამატებით შემდეგი 2 ხაზის გარდა, დანარჩენ ხაზებს ჩავსვამთ ფრჩხი-
ლებში.
ge
.
ელ
ვე
u.
achiko@debian:∼$ sed '2,+2!s/.*/(&)/' countries.txt
(1 Georgia)
ო
ed
თ
2 France
3 USA
შა
u.
4 Germany
ერ
მუ
(5 Great Britain)
bt
მწ
სა
li@
13.2.4 გამოსვლა
მო
ის
ra
1 Georgia
შვ
ba
2 France
3 USA
ნი
liz
შე
ასე კი, ეკრანზე გამოვა საწყისი სტრიქონები Fra გამოსახულების შემცველ პირველ
e
ხაზიანად.
il.
ვთ
ch
2 France
ar
გთ
13.2.5 გარდაქმნა
y (transform) ბრძანება, tr ბრძანების მსგავსად, თითოეული ასო-ნიშნის გარდაქმნას,
გადაკეთებას ახორციელებს.
ამ ბრძანებით a შეიცვლება X-ით, e Y-ით, i კი Z-ით.
179
achiko@debian:∼$ sed 'y/aei/XYZ/' countries.txt
GYorgZX
2 FrXncY
3 USA
4 GYrmXny
5 GrYXt BrZtXZn
:
ა ზე
13.2.6 ხაზის ნომერი
სტ
= სიმბოლო ბრძანებას წარმოადგენს sed-ში და მას დასამუშავებელი ხაზების ნომ-
”
რები გამოაქვს.
ა!
ო
სი
ფ
achiko@debian:∼$ sed '=' countries.txt
1
ge
.
1 Georgia
ელ
2
ვე
u.
2 France
3
ო
ed
თ
...
შა
u.
ერ
ეს ბრძანება გამოიტანს ხაზის ნომერს. შემდეგ კი, ნაგულისხმევები მნიშვნელობით,
მუ
bt
მთლიან ხაზს. იმისათვის, რომ ეკრანზე მთლიანი ხაზი არ გამოვიდეს, სასურველი იქნება -n
მწ
li@
მო
1
vi
2
ბი
არ
sh
3
4
ნე
ra
5
ეს
შვ
ba
liz
1
e
il.
ვთ
ar
13.2.7 შეცვლა
180
achiko@debian:∼$ sed '1,4c text' countries.txt
text
5 Great Britain
:
ზე
შეიცავს ახალ ხაზზე გადასვლის სიმბოლო(ებ)ს (ანუ ტექსტი მრავალხაზიანია), მაშინ \ უნდა
”
გამოვიყენოთ ხაზების ბოლოს (ბოლო ხაზის გარდა). ასე:
ა
სტ
achiko@debian:∼$ cat countries.txt | sed '1,4c text1\
> test2\
ა!
ო
> text3
სი
ფ
> '
text1
ge
test2
.
ელ
text3
5 Great Britain ვე
u.
ო
ed
თ
შა
u.
ერ
13.2.8 ჩამატება
მუ
bt
მწ
li@
ხაზის შემდეგ და წინ.
მო
vi
ბი
არ
START
ნე
1 Georgia
ra
ეს
2 France
შვ
3 USA
ba
4 Germany
ნი
5 Great Britain
liz
შე
1 Georgia
ხო
2 France
ar
3 USA
4 Germany
გთ
5 Great Britain
END
START
1 Georgia
2 France
:
3 USA
ზე
4 Germany
5 Great Britain
ა
სტ
END
ა!
ო
სი
ფ
13.2.9 ფაილის კითხვა და ფაილში ჩაწერა
ge
.
ელ
r ბრძანებით შესაძლებელია მოცემულ მისამართზე (ხაზზე) სხვა ფაილის შიგთავსი
ჩავსვათ.
ვე
u.
ო
ed
თ
achiko@debian:∼$ sed '$r distros.txt' countries.txt
შა
...
ე
u.
4 Germany
ერ
მუ
5 Great Britain
bt
Debian 9.4 10/03/2018
მწ
სა
vi
sh
ar
182
achiko@debian:∼$ sed -e 's/Great\Britain/Canada/' -e 'w newfile.txt'
countries.txt
1 Georgia
2 France
3 USA
4 Germany
:
5 Canada
ა ზე
13.2.10 დაჯგუფება
სტ
რამდენიმე ინსტრუქციის გადაცემა -e ოფციის გარეშე, ; სიმბოლოთიც არის შესაძ-
”
ლებელი. ასე:
ა!
ო
სი
ფ
achiko@debian:∼$ sed 's/Great\Britain/Canada/; w newfile.txt' countries.txt
ge
1 Georgia
.
ელ
2 France
3 USA
ვე
u.
4 Germany
ო
ed
5 Canada
თ
შა
u.
წერტილ-მძიმით, ძირითადად, მარტივ ბრძანებებს აცალკევებენ ხოლმე. ასე, მაგალი-
ერ
მუ
თად:
bt
მწ
სა
li@
achiko@debian:∼$ sed '1d;3d;5d' countries.txt
2 France
მო
4 Germany
ის
vi
ბი
არ
”
გვსურს, რომ წავშალოთ ბოლო ხაზი, თუ ის შეიცავს Bri გამოსახულებას, მაშინ დაჯგუფება
ra
ეს
დაგვჭირდება.
შვ
ba
ნი
1 Georgia
შე
2 France
e
3 USA
il.
4 Germany
ვთ
ch
ar
გთ
183
წერილი ბრძანებები გადაეცეს. ამისათვის e ბრძანებას არგუმენტი არ უნდა გადავცეთ. ხოლო,
თუ e-ს არგუმენტი უწერია, ისიც აუცილებლად შელის ბრძანება უნდა იყოს. მოდით, ავიღოთ
ერთი ფაილი და მასში ხაზ-ხაზ შელის ბრძანებები ჩავწეროთ:
:
date
ზე
whoami
ა
სტ
achiko@debian:∼$ sed 'e' cmd.txt
Hello Georgia
ა!
ო
Tue Jul 10 15:56:32 +04 2018
სი
ფ
achiko
ge
.
ამ ბრძანებაში e ბრძანებას არგუმენტი არ აქვს და შესაბამისად cmd.txt ფაილში ჩაწე-
ელ
რილი ბრძანებები შესრულდება sed-ის მიერ.
ვე
u.
ო
ed
achiko@debian:∼$ sed 'e echo TEST' cmd.txt
თ
TEST
შა
u.
ერ
TEST
მუ
bt
date
მწ
TEST
სა
li@
whoami
მო
ის
sh
წარდმოადგენს e ბრძანებისთვის.
მხოლოდ პირველი ხაზის წინ რომ ჩავსვათ შელის რამე ბრძანებ(ებ)ის შედეგი, მაშინ
ნე
ra
შვ
ba
achiko@debian:∼$ sed "1e echo USER $USER read the file; date" cmd.txt
ნი
date
il.
ვთ
whoami
ch
ხო
184
ბის მოძრაობა სარეზერვო ბუფერიდან გამოსახულების ბუფერში და პირიქით. თავდაპირველად
ორივე ბუფერი ცარიელია.
მოდით, სარეზერვო ბუფერიც ჩავრთოთ საქმეში და ვნახოთ, რამდენად გაზრდის ის
sed-ის შესაძლებლობებს.
:
ზე
h (hold) გამოსახულების ბუფერის შიგთავსს აკოპირებს სარეზერვო ბუფერში. ამ
უკანასკნელში არსებული მონაცემი იშლება.
ა
სტ
H (Hold) ეს ბრძანება კი გამოსახულების ბუფერის შიგთავსს ბოლოში დაამატებს
სარეზერვო ბუფერს. დამატებული შიგთავსი ახალი ხაზიდან ჩაიწერება.
ა!
ო
g (get) აკოპირებს სარეზერვო ბუფერის შიგთავსს გამოსახულების ბუფერში. ასე
სი
ფ
ეს უკანასკნელი იშლება.
ge
G (Get)
.
ელ
სახულების ბუფერს, ახალი ხაზიდან.
ვე
u.
ო
ed
თ
მათი გამოყენების მაგალითები:
შა
u.
ერ
achiko@debian:∼$ cat countries.txt | sed 'G'
მუ
1 Georgia
bt
მწ
სა
li@
2 France
მო
3 USA
ის
vi
ბი
არ
4 Germany
sh
ნე
5 Great Britain
ra
ეს
შვ
ba
ფერის შიგთავსი. ახლა ხაზზე, როგორც გამოჩნდა, არაფერი ჩაიწერა, რადგან სარეზერვო ბუფე-
liz
რი ცარიელია. შესაბამისად, ეს ბრძანება თითოეული ხაზის შემდეგ ერთ ცარიელ ხაზს ჩასვამს.
შე
1 Georgia
ხო
ar
2 France
გთ
...
თითოეულ ხაზის წინ რომ ჩავსვათ ერთი ახალი ხაზი, ასე უნდა მოვიქცეთ:
185
achiko@debian:∼$ cat countries.txt | sed 'x;p;x'
1 Georgia
2 France
:
3 USA
ზე
4 Germany
ა
სტ
5 Great Britain
ა!
ო
ორი ხაზის ჩასასმელად კი ასე:
სი
ფ
რ
ge
achiko@debian:∼$ cat countries.txt | sed 'x;p;p;x'
.
ელ
ვე
u.
1 Georgia
ო
ed
თ
შა
u.
2 France
ერ
მუ
bt
მწ
...
სა
li@
მო
მოდით, ახალი ხაზი ჩავსვათ მხოლოდ იმ ხაზამდე და მის შემდეგაც, რომელიც შეიცავს
ის
sh
1 Georgia
ra
ეს
2 France
შვ
ba
3 USA
ნი
liz
4 Germany
შე
5 Great Britain
e
il.
ვთ
5 Great Britain
გთ
4 Germany
3 USA
2 France
1 Georgia
186
ავხსნათ, რა გავაკეთეთ: პირველ ხაზზე მხოლოდ h ბრძანებით ვმოქმედებთ, ანუ ხაზს
ვაკოპირებთ სარეზერვო ბუფერში. G ბრძანება გამოვტოვეთ, რადგან 1!G მიუთითებს, რომ მხო-
ლოდ პირველი ხაზზე არ შესრულდეს ეს ბრძანება. მეორე ხაზიდან კი G;h ბრძანებები სრულდე-
ბა. ანუ, ჯერ ვუმატებთ მეორე ხაზს სარეზერვო ბუფერს ბოლოში ახალ ხაზიდან (იქ უკვე გვაქვს
პირველი ხაზი დამახსოვრებული), შემდეგ კი ვაკოპირებთ მას უკან, გამოსახულების ბუფერში.
ასე გრძელდება ბოლომდე. $p უზრუნველყოფს მხოლოდ ბოლო ხაზის დამუშავების შედეგის
გამოტანას ეკრანზე.
:
ზე
$-ის გარეშე პროცესის სრულ ციკლს დავინახავთ. ასე:
ა
სტ
achiko@debian:∼$ cat countries.txt | sed -n '1!G;h;p'
1 Georgia
ა!
2 France
ო
1 Georgia
სი
ფ
3 USA
2 France
ge
.
1 Georgia
ელ
4 Germany
ვე
u.
3 USA
2 France
ო
ed
თ
1 Georgia
შა
5 Great Britain
ე
u.
4 Germany
ერ
მუ
3 USA
bt
2 France
მწ
სა
1 Georgia
li@
მო
ის
ba
პირველ შემხვედრ ახალ ხაზამდე შლის, ანუ მთლიანი ხაზის პირველ პორციას.
ასეთივე განსხვავებაა p-სა და P ბრძანებებს შორის. P-თი, გამოდის გამოსახულების
ნი
sed ბრძანებაში ნაკადების მართვაც არის შესაძლებელი. ამისთვის ჭდე უნდა გამოვიყე-
e
”
ნება კი b ბრძანებით ხორციელდება. მასაც ჭდის სახელი უნდა მივუთითოთ.
ch
187
მოდით, მისი შემდეგი ორი ხაზი წავშალოთ:
:
ზე
ახლა ფაილში ყოველი ახალ ხაზზე გადასვლის სიმბოლო შევცვალოთ უბრალო გამო-
ა
ტოვებით. ერთი შეხედვით, ამოხსნა ასეთი მარტივი ჩანაწერი უნდა იყოს.
სტ
achiko@debian:∼$ cat countries.txt | sed 's/\n/ /'
ა!
ო
1 Georgia
სი
ფ
2 France
3 USA
ge
.
4 Germany
ელ
5 Great Britain
ვე
u.
თუმცა შედეგს, როგორც ვხედავთ, ვერ ვაღწევთ. მოდით, დავფიქრდეთ რატომ? გავიხ-
ო
ed
თ
სენოთ, თუ როგორ მუშაობს sed. ის იღებს ხაზს, განათავსებს მას გამოსახულების ბუფერში
შა
u.
ერ
ახალ ხაზზე გადასვლის სიმბოლო არ გვექნება, თუ N ბრძანება (ან მსგავსი - მაგალითად H) არ
მუ
bt
ცემს ახალ ხაზზე დავუმატოთ შემდეგი ხაზი N ბრძანებით (შედეგად, ახალ ხაზზე გადასვლის
მწ
სა
vi
achiko@debian:∼$ cat countries.txt | sed ': mishka; N; $!b mishka; s/\n/ /g'
ბი
არ
ra
ეს
ავხსნათ დეტალურად:
შვ
ba
გ) ვუბრუნდებით ჭდეს და ვმოქმედებთ N-ით მანამ, სანამ ბოლო ხაზს არ მივაღწევთ ($!b
e
mishka ნიშნავს, რომ ბოლო ხაზზე ჭდეზე აღარ გადავიდეთ და, შესაბამისად, N აღარ
il.
გამოვიყენოთ).
ვთ
ch
188
ჯერ შევიტანოთ ახალ ფაილში cmd.sed-ში ინსტრუქციები. ასეთ ფაილში #-ით დაწყე-
ბული ხაზი მხედველობაში არ მიიღება და ის კომენტარების ჩაწერის საშუალებას გვაძლევს
დოკუმენტირებისთვის.
achiko@debian:∼$ vi cmd.sed
# ვქმნით ჭდეს სახელად mishka
:
: mishka
ზე
# გამოსახულების ბუფერს ვუმატებთ შემდეგ ხაზს
N
ა
# ვუბრუნდებით ჭდეს სანამ ბოლო ხაზს არ მივაღწევთ
სტ
$!b mishka
# ვცვლით ახალ ხაზზე გადასვლის სიმბოლოს გამოტოვებით
ა!
ო
s/\n/ /g
სი
ფ
achiko@debian:∼$ sed -f cmd.sed countries.txt
1 Georgia 2 France 3 USA 4 Germany 5 Great Britain
ge
.
ელ
ვე
sed-ს კიდევ ბევრი შესაძლებლობა აქვს. მათი სრული ჩამონათვალის სანახავად GNU
u.
sed-ის დოკუმენტაციას მიმართეთ: https://www.gnu.org/software/sed/manual/sed.html
ამ თავის ბოლოს, sed ბრძანების საშუალებით ვნახოთ ამოცანის გადაწყვეტის რამდე-
ო
ed
თ
ნიმე ეგზოტიკური ხერხი.
შა
”
ე
შემოვატრიალოთ ფრაზა - sed-ით განვახორციელოთ იგივე rev ბრძანება:
u.
ერ
მუ
bt
achiko@debian:∼$ echo Mishka | rev
მწ
akhsiM
სა
li@
achiko@debian:∼$ echo Mishka | sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
მო
akhsiM
ის
vi
sh
ნე
1 Georgia
ba
2 France
ნი
3 USA
liz
4 Germany
შე
5 Great Britain
e
il.
ვთ
189
გთ
ხო
ვთ ეს
ar შე არ
ch ნი ის
შვ სა
il. ნე
eliz ბი მუ
შა
ba მო ო
ra მწ ვე
sh ერ რ
vi
li@ ე თ
სი
ა!
bt ელ
u. .
ფ
ed ო
u. სტ
ge აზე
:
თავი 14
:
ა ზე
არქივი, შეკუმშვა
სტ
ა!
ო
სი
ფ
კ
ომპიუტერზე მუშაობისას ერთ-ერთი მთავარი ამოცანაა სისტემაში არსებული მონაცე-
ge
მების მთლიანობის, ინტეგრალობის უზრუნველყოფა. ერთ-ერთი გზა, რომელსაც სისტე-
.
ელ
მის ადმინისტრატორი მიმართავს ამ ამოცანის გადასაწყვეტად არის სისტემის ფაილების
ვე
დროული სარეზერვო ასლების გაკეთება. მაშინაც კი, თუ თქვენ არ ხართ სისტემის ად-
u.
მინისტრატორი, სასარგებლოა, თქვენი ფაილების დიდი კოლექციის ასლები გადაიღოთ ერთი
ო
ed
ადგილიდან მეორეში ან ერთი მოწყობილობიდან მეორეზე გადაიტანოთ.
თ
ასლების გაკეთება, მეორეს მხრივ, მოითხოვს გქონდეთ საკმარისი თავისუფალი ადგი-
შა
u.
ლი შესანახ მოწყობილობაზე.
ერ
მუ
bt
მალურად დიდმა მონაცემმა მინიმალურად მცირე ადგილი დაიკავოს. ამისთვის მოიგონეს მო-
მწ
სა
ინტერნეტით.
vi
sh
დესაც ჭარბი ინფორმაციის ამოღება, ამოცლა ხდება და ამის ხარჯზე ზომაში ვიგებთ. წარ-
მოვიდგინოთ ერთი ასეთი მაგალითი. დაუშვათ, გვაქვს სურათი, სრულიად შავი ფერის, რომ-
ნე
ra
ლის ტექნიკური პარამეტრები ასეთია: მისი განზომილება, სიგრძე და სიგანე, 100x100 წერ-
ეს
შვ
გამაში სულ გვაქვს 16777216 (2^24) ცალი ფერი და კონკრეტული პიქსელი, ერთ-ერთი ამ
liz
ფერთაგანია. ჩვენს შემთხვევაში, ყველა შავია - შავი ფერი კი 24 ცალი 0-იანით მოიცემა
შე
(000000000000000000000000).
e
სურათის სრული ზომა 100 * 100 * 3 = 30 000 ბაიტი გამოვა, რადგან თითოეული
il.
0000000000000000000 ფერით.
ar
დირებით ასე ჩავწეროთ: გვაქვს პიქსელი1 , პიქსელი2 ... პიქსელი10000 და ბოლოში მივუწეროთ,
რომ ყველა მათგანის ფერი არის 000000000000000000000000. შედეგად, მოვახდინეთ მო-
ნაცემთა კომპრესია და ამოვიღეთ ჭარბი ინფორმაცია. ასეთ კოდირებას run-length encoding
ჰქვია. ის ერთ-ერთი მარტივი კომპრესიის ტექნიკაა. სადღეისოდ, უფრო განვითარებული და
კომპლექსური ტექნიკები გამოიყენება, თუმცა მიზანი მაინც ერთი რჩება - მოვაშოროთ ჭარბი
ინფორმაცია.
191
კომპრესიის ალგორითმები ორ ძირითად კატეგორიად იყოფა: დანაკარგის გარეშე და
დანაკარგით. დანაკარგის გარეშე ტექნიკით შეკუმშული ფაილის აღდგენის შემდეგ, ის ორი-
გინალ ფაილს სრულიად დაემთხვევა. დანაკარგიანი ტექნიკის გამოყენებისას კი, აღდგენილი
ვერსია მაქსიმალურად მიუახლოვდება ორიგინალს, თუმცა 100%-ით ვერა. დანაკარგიანი შე-
კუმშვის მაგალითებია JPEG (სურათებისთვის), MP3 (მუსიკისთვის). ამ თავში ჩვენ მხოლოდ
დანაკარგის გარეშე შეკუმშვის ტექნიკას მიმოვიხილავთ.
:
ა ზე
14.1 gzip
სტ
ლინუქს სისტემებში ფაილების შესაკუმშად ხშირად გამოიყენება gzip ბრძანება. შეს-
ა!
ო
რულების შემდეგ, ეს ბრძანება ორიგინალ ფაილს შეცვლის კომპრესირებული ვერსიით და
ფაილის დასახელებაში მისანიშნებლად .gz გაფართოებას დაუმატებს. შეკუმშული ფაილების
სი
ფ
აღდგენა (დეკომპრესია, განკუმშვა) gunzip ბრძანებით ხდება. მოვიყვანოთ მისი გამოყენების
მარტივი მაგალითი. ჯერ შევქმნათ სატესტო ფაილი foobar.txt1 :
ge
.
ელ
ვე
u.
achiko@debian:∼$ man {ls,find,man} > foobar.txt
achiko@debian:∼$ ls -lh foobar.txt
ო
ed
თ
-rw-r--r-- 1 achiko achiko 123K Jun 25 15:57 foobar.txt
შა
achiko@debian:∼$
ე
u.
achiko@debian:∼$ gzip foobar.txt
ერ
მუ
bt
-rw-r--r-- 1 achiko achiko 38K Jun 25 15:57 foobar.txt.gz
მწ
სა
vi
sh
შვ
ba
liz
შე
achiko@debian:∼$ ls test.*
test2.txt.gz test.txt.gz
ხო
ar
1
ტერმინი foobar ან foo კომპიუტერში მუშაობისას გამოიყენება ობიექტის, ცვლადის, ფუნქციის ან ბრძანების და-
სახელებისას. foo ხშირად bar-თან ერთად გამოიყენება. ეს ტერმინი II მსოფლიო ომის დროს სამხედროების მიერ
გამოყენებულ ჟარგონთან, FUBAR-თან, ასოცირდება.
192
achiko@debian:∼$ gzip -tv foobar.txt.gz
foobar.txt.gz: OK
:
achiko@debian:∼$ gzip -c foobar.txt > foobar.txt.gz
ზე
achiko@debian:∼$ ls foobar.txt*
foobar.txt foobar.txt.gz
ა
სტ
ამ მაგალითში, სინამდვილეში, ფაილის შეკუმშული ვერსია სტანდარტულ გამოსას-
ა!
ო
ვლელზე გამოგვაქვს (-c ოფციია უზრუნველყოფს ამას), რომელსაც შემდეგ გადავამისამარ-
თებთ foobar.txt.gz ფაილში. გადამისამართების გარეშე ეკრანზე დავინახავდით შეკუმშული
სი
ფ
ვერსიის შიგთავსს.
ge
.
-k (--keep) ოფციით კი პირდაპირ ვაიძულებთ gzip-ს, რომ ორიგინალი ფაილი შეი-
ელ
ნახოს.
ვე
u.
achiko@debian:∼$ gzip -k foobar.txt
ო
ed
თ
შა
ე
როგორ შევკუმშოთ დირექტორიაში არსებული ყველა ფაილი? ამისთვის დაგვჭირდება
u.
ერ
-r ოფცია.
მუ
bt
მწ
სა
achiko@debian:∼$ ls TXT/
ის
vi
sh
ra
ეს
liz
...
il.
ar
193
მნიშვნელობა არის -6.
სწრაფი შეკუმშვა:
:
ზე
საუკეთესო შეკუმშვა:
ა
სტ
achiko@debian:∼$ gzip -9 foobar.txt
achiko@debian:∼$ ls -l foobar.txt.gz
ა!
ო
-rw-r--r-- 1 achiko achiko 37919 Jun 25 15:57 foobar.txt.gz
სი
ფ
როგორც წესი, ფაილების შეკუმშვას მიმართავენ მათი შენახვის, სხვასთან გაგზავნის
ge
.
(მაგალითად ელ. ფოსტით) ან გადატანის მიზნით. გადატანის შემდეგ კი აუცილებლად უნდა მო-
ელ
ვე
ვახდინოთ მათი დეკომპრესია, რათა ამ ფაილებზე სხვადასხვა ოპერაციის (მაგალითად, რედაქ-
u.
ტირების) გაკეთება შეგვეძლოს. თუმცა, shell-ში არსებობს ბრძანებები, რომლებიც პირდაპირ
შეკუმშულ ფაილებზე ოპერირებს. ასეთებია: zcat, zless, zmore, zgrep, zdiff და სხვა.
ო
ed
თ
შა
u.
achiko@debian:∼$ zcat foobar.txt.gz
ერ
მუ
bt
ამ ბრძანებით პირდაპირ ვნახულობთ file.txt ფაილის შიგთავსს. zcat gunzip -c
მწ
”
სა
აღსანიშნავია ისიც, რომ gzip ბრძანებას მხოლოდ ჩვეულებრივი ტიპის ფაილების შე-
ის
vi
sh
14.2 bzip2
ნე
ra
ეს
შეკუმშვა, როგორც წესი, უკეთესი ხარისხისაა, თუმცა შეკუმშვისა და მით უფრო დეკომპრესიის
ნი
დრო გაცილებით დიდია, ვიდრე gzip ბრძანების შემთხვევაში. bzip2 შეკუმშვის შემდეგ ფაილს
liz
”
მოდით, ვნახოთ მისი გამოყენების რამდენიმე მაგალითი. bzip2-ს, უმეტეს შემთხვევა-
e
შევკუმშოთ ფაილი:
ch
ხო
ან
194
achiko@debian:∼$ bzip2 -k foobar.txt
:
ზე
შევკუმშოთ სწრაფად:
ა
სტ
achiko@debian:∼$ bzip2 -1 foobar.txt
ა!
ო
bzip2 ბრძანებისთვისაც სამართლიანია შეკუმშვის ხარისხის დონის მითითება ოფცი-
სი
ფ
ებით -1 (უსწრაფესი)-დან -9 (საუკეთესო შეკუმშვა)-მდე.
time ბრძანებით შეგვიძლია, ვნახოთ რა დრო დაიხარჯა მოცემული ბრძანების შესას-
ge
.
ელ
რულებლად. ასე უკეთ დავინახავთ განსხვავებას უსწრაფესსა და საუკეთესო შეკუმშვას შორის.
ვე
u.
achiko@debian:∼$ time bzip2 -1 foobar2.txt
ო
ed
თ
შა
real 0m20.627s
ე
u.
user 0m14.304s
ერ
მუ
sys 0m6.168s
bt
achiko@debian:∼$ bunzip2 foobar2.txt.bz2
მწ
li@
მო
real 0m45.857s
ის
user 0m45.796s
vi
sys 0m0.048s
ბი
არ
sh
ნე
ba
ვერსიას. მისი დეკომპრესიის შედეგად მივიღებთ ფაილს file, სადაც ორიგინალი ფაილების
ვთ
195
დეკომპრესია. მაშ, რა მოხდება, თუ ზომით პატარა ან სულაც ცარიელი ფაილის შეკუმშვას შე-
ვეცდებით (თუმცა, ეს ოპერაცია აზრს მოკლებულია)? რა თქმა უნდა, ამ შემთხვევაში ფაილის
ზომა იზრდება.
:
-rw-r--r-- 1 achiko achiko 6 Jun 25 17:57 new_file
ზე
achiko@debian:∼$ gzip new file
achiko@debian:∼$ ls -l new file.gz
ა
-rw-r--r-- 1 achiko achiko 35 Jun 25 17:57 new_file.gz
სტ
ა!
ო
როგორც ვთქვით პატარა ზომის ფაილის შეკუმშვის დროს ზომა პირიქით გაიზარდა.
სი
ფ
დაიმახსოვრეთ
ge
.
აზრი არ აქვს უკვე შეკუმშული ფაილის ხელახლა შეკუმშვას. მაგალითად, jpg გაფარ-
ელ
ვე
თოების ფაილი, თავის მხრივ, უკვე კომპრესირებულია და მისი შეკუმშვა დიდ ვერაფერ
u.
შედეგს მოგვცემს.
ო
ed
თ
შა
14.3 tar
ე
u.
ერ
მუ
bt
ნიმე ფაილის შიგთავსის შეკუმშული ვერსია ერთ ფაილში, თუმცა, როდესაც საქმე ფაილების
მწ
სა
ra
ქივი ზომით გაცილებით დიდი ფაილი გამოვა, ვიდრე მაში განთავსებული ფაილების ზომების
შვ
ba
ჯამი. თუმცა შეკუმშვის ბრძანებასთან ერთად კომბინაციაში, საკმაოდ კარგ შედეგს იძლევა და,
შესაბამისად, მიღებულ ფორმადაც ითვლება.
ნი
ბი და ფაილები.
e
il.
ვთ
2
ტერმინი tar მოდის Tape ARrchive-დან. Linux/Unix სისტემის ადმინისტრატორები ხშირად მიმართავენ მონაცე-
მების მაგნიტურ ლენტებზე (tape) გადატანას.
196
-f (--file) archive გვეუბნება, რომ არქივი იყოს ფაილი სახელად archive ან მოწყო-
ბილობა archive, ამ დროს მონაცემები დაარქივდება მოწყობილო-
ბაზე (როგორც აღვნიშნეთ, დაარქივება შეიძლება მოხდეს მაგნი-
ტურ ლენტებზე).
:
ტირეს (-) გარეშეც მივუთითოთ, ასე:
ა ზე
achiko@debian:∼$ tar cvf archive-2018.06.25.tar test.txt test2.txt TXT/
სტ
ვახსენეთ, რომ არქივის ზომა ყოველთვის უფრო მეტია, ვიდრე მასში შემავალი ფაი-
ა!
ო
ლების ზომების ჯამი. შესაბამისად, უპრიანია, ის შევკუმშოთ gzip-ით ან bzip2-ით:
სი
ფ
achiko@debian:∼$ gzip archive-2018.06.25.tar
ge
.
ელ
ვე
u.
ამ მაგალითში ჩვენ ჯერ არქივი შევქმენით და შემდეგ ის, ზომის მოგების მიზნით, შევ-
კუმშეთ. თუმცა tar ბრძანებით, z ოფციის გამოყენებით, ერთბაშად შეგვეძლო დაარქივებისა
ო
ed
თ
და შეკუმშვის ოპერაციის განხორციელება, ასე: (შეკუმშვა, ამ შემთხევაში, gzip ბრძანებით
შა
ხდება):
ე
u.
ერ
მუ
bt
TXT/
მწ
სა
li@
მო
sh
ra
ეს
liz
შე
თოთ.
ar
გთ
197
achiko@debian:∼$ tar -xvzf archive-2018.06.25.tgz test.txt
ან
:
ზე
ხოლო .bz2 აქრივიდან კი ასე:
ა
სტ
achiko@debian:∼$ tar -xvjf archive-2018.06.25.tbz2 test.txt
ა!
ო
ან
სი
ფ
achiko@debian:∼$ tar --extract --file=archive-2018.06.25.tbz2 test.txt
ge
.
ელ
ვე
შესაძლებელია, აგრეთვე, მაგენერირებელი სიმბოლოს გამოყენება. ყურადღება მიაქ-
u.
ციეთ იმას, რომ ეს ოფცია მხოლოდ tar-ის GNU-ს ვერსიას აქვს:
ო
ed
თ
შა
ე
achiko@debian:∼$ tar -xvf archive-2018.06.25.tar --wildcards "*.txt"
u.
ერ
მუ
bt
achiko@debian:∼$ tar -zxvf archive-2018.06.25.tgz --wildcards "*.txt"
მწ
სა
li@
მო
ის
sh
ra
ეს
შვ
liz
ბიც.
il.
ვთ
ar
198
-T file მიუთითებს ფაილების სიას არქივის შესაქმნელად. ჩვენს შემთხვევაში, -T
ოფციის არგუმენტი file-ის ნაცვლად არის - . tar ბრძანებაში კი - ნიშნავს სტანდარტულ
” ”
შესასვლელზე მიღებულ ფაილებს.
:
ზე
achiko@debian:∼$ tar -vf archives.tar --delete file1 file2
ა
აღსანიშნავია, რომ ამოშლისას file ისეთი path-ით უნდა მივუთითოთ, როგორითაც
სტ
არის ის არქივში შენახული.
ა!
ო
achiko@debian:∼$ tar -tf archive-2018.06.25.tar
სი
ფ
...
TXT/distros.txt
ge
.
TXT/versions.txt
ელ
Tux.jpg
ვე
u.
achiko@debian:∼$ tar -vf archive-2018.06.25.tar --delete Tux.jpg
achiko@debian:∼$ tar -tf archive-2018.06.25.tar
ო
ed
თ
...
შა
TXT/distros.txt
ე
u.
ერ
TXT/versions.txt
მუ
bt
მწ
ერთ-ერთ წინა ბრძანებაში JPG archives.tar არქივს დავუმატეთ სხვა ფაილები. თუმ-
სა
li@
ცა, მოდით, ჯერ ვთქვათ, თუ როგორ შეიძლება შევქმნათ find ბრძანებით მოძებნილი ფაილე-
მო
ბის არქივი. მაგალითისთვის მოვძებნოთ png გაფართოების ფაილები (სისტემეში ისინი მრავ-
ის
sh
/usr/share/doc/groff-base/html/img/pic30.png
შვ
/usr/share/doc/groff-base/html/img/pic43.png
ba
...
ნი
liz
თხილებაც გამოვა ეკრანზე. ეს შეტყოვინება გვეუბნება, რომ უსაფრთხოების მიზნით tar ბრძა-
e
ტომ ხდება, რომ არქივიდან ამოღების დროს მსგავსი დასახელების ფაილზე არ მოხდეს ახალი
ვთ
შიგთავსის გადაწერა და ძველის დაკარგვა. ამიტომ, ჯობს, რომ არქივში ფაილების ფარდო-
ch
ბითი გზა მოვათავსოთ. ხოლო არქივიდან ამოღების დროს, -C ოფციის გამოყენებით, თავად
ხო
მოძებნილი ფაილების tar ბრძანებისთვის ერთ ხაზად გადაცემა, მილის და xargs ბრძა-
ნების დახმარებით, ასე შეგვიძლია:
199
14.4 cpio
:
ზე
$ ls *.txt | cpio -ov > txt.cpio
ა
სტ
ასე შეიქმნება არქივი txt.cpio, სადაც მიმდინარე დირექტორიის ყველა .txt გაფარ-
თოების ფაილი შევა. -o, --create ოფცია არქივის ფაილის შექმნას ნიშნავს, -v, --verbose-
ა!
ო
ით კი ეკრანზეც დავინახავთ იმ ფაილების დასახელებას, რომლებიც არქივში კოპირდება.
თუ გვსურს, რომ დირექტორიის მთლიანი ხე დავაარქივოთ (ქვე-დირექტორიების ჩათ-
სი
ფ
ვლით), მაშინ ასეთი ბრძანება უნდა გავუშვათ:
ge
.
ელ
$ find . -print -depth | cpio -ov > dir.cpio
ვე
u.
ო
-depth ოფციით find ბრძანება მოძებნილი დირექტორიის სახელების გამოტანამდე
ed
თ
ჯერ მასში არსებულ სტრუქტურას გამოიტანს.
შა
u.
ერ
მუ
bt
$ cpio -idv < dir.cpio
მწ
სა
li@
მო
ფაილებია შენახული.
sh
ra
ეს
ba
ნი
გახსნას tar არქივი. ზოგად შემთხვევებში, tar უფრო პოპულარულია და უფრო ხშირად გამო-
შე
იყენება, ვიდრე ვიდრე cpio, მეტი სიმარტივისა და იმის გამო, რომ tar ბრძანებას დამატებით
e
cpio ბრძანების ერთ-ერთი ძლიერი მხარე ისაა, რომ ძალიან მარტივად ახდენს დიდი
ხისებრი სტრუქტურის სხვა დირექტორიაში გადატანას. ამისთვის ჯერ უნდა შევქმნათ გადასა-
ch
ტანი ფაილების სია და შემდეგ მილით გადავცეთ cpio ბრძანებას. -p, --pass-through ოფცია
ხო
უზრუნველყოფს ფაილების გადაცემას სხვა დირექტორიაში. -0, --null ოფცია კი, find-ის
ar
200
ნოთ: დავუშვათ, გვსურს ჩვენი პირადი დირექტორიის სრული ასლი გადავიტანოთ /tmp/dir
დირექტორიაში.
ვნახოთ, როგორ ხდება ეს ოპერაცია სხვადასხვა ბრძანებით. თან შედარებისთვის შე-
ვამოწმოთ, რა დრო მიაქვს თითოეულ ოპერაციას:
$ cd $HOME
:
$ time find . -depth -print0 | cpio -pvd0 /tmp/dir/
ზე
real 0m3.589s
ა
user 0m0.036s
სტ
sys 0m1.220s
$ rm -rf /tmp/dir/{.[^.],.??*,*} # ვშლით ყველაფერს /tmp/dir-ში
ა!
ო
$ cd $HOME; time tar -c . | tar -x -C /tmp/dir/
სი
ფ
real 0m4.692s
ge
.
user 0m0.060s
ელ
sys 0m0.984s
ვე
u.
$ rm -rf /tmp/dir/{.[^.],.??*,*}
$ time rsync -a . /tmp/dir
ო
ed
თ
შა
real 0m3.731s
ე
u.
user 0m1.092s
ერ
მუ
sys 0m0.848s
bt
$ rm -rf /tmp/dir/{.[^.],.??*,*}
მწ
სა
$ time cp -a . /tmp/dir
li@
მო
real 0m4.561s
ის
user 0m0.000s
vi
sys 0m0.440s
ბი
არ
sh
ნე
time ბრძანებამ ეკრანზე გამოიტანა დეტალური ინფორმაცია: Real - არის დრო, რომე-
ra
ეს
ნებულია ის დრო, რაც ჩვენი პროცესის გარდა სხვა პროცესების შესრულებისთვის დაიხარჯა
ba
სისტემაში. User - არის პროცესორის ის დრო (ე.წ. CPU time), რომელიც ამ პროცესის შეს-
ნი
წარმოდგენა შეიძლება შეგვექმნა იმაზე, თუ რომელი ბრძანება რამდენად უფრო წარმადია ერ-
il.
ეს დირექტორია; ბევრ Sparse ფაილებთან გვაქვს თუ არა საქმე (ამ შემთხვევისთვის ჩვენ მიერ
განხილულ ბრძანებებს სპეციალური ოფციები აქვთ) და ა.შ.
გთ
ფაილების შესაკუმშად ჩვენ განვიხილეთ ბრძანებები gzip და bzip2, თუმცა, მათ გარ-
და, არსებობს სხვა პროგრამებიც, რომლებიც მსგავსი დანიშნულებისთვის გამოიყენება. ესენია:
rar, zip, 7z და სხვა. ისინი, შეკუმშვის გარდა, დაარქივების ფუნქციასაც ასრულებენ ამადრო-
ულად. მათი დეტალურად განვიხილვას აქ არ შევუდგებით. უბრალოდ, შევადაროთ ამ ბრძანე-
ბების წარმადობა ერთმანეთს შეკუმშვის მხრივ. მივიღებთ შემდეგი სახის ცხრილს:
201
შეკუმშვის ბრძანებების შედარება
:
ხელმისაწვდომობა (Unix/Linux) gzip, bzip2 → zip → 7z → rar
ზე
ხელმისაწვდომობა (Windows) zip → rar → 7z → gzip, bzip2
ა
სტ
ა!
ო
სი
ფ
რ
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
202
თავი 15
:
ა ზე
ამოცანების გაშვების ავტომატიზაცია
სტ
ა!
ო
სი
ფ
კ
ომპიუტერზე მუშაობისას ხშირია ისეთი სიტუაცია, როდესაც ამოცანის პერიოდულად გაშ-
ვებაა საჭირო. ასეთ დროს, ამ ამოცანების ხელით გაშვების ნაცვლად, Unix-ის მსგავს
ge
.
ელ
სისტემებში არსებობს ამოცანების ავტომატურად გაშვების მძლავრი სერვისი - cron.
ვე
u.
ო
15.1 cron
ed
თ
შა
ე
cron წარმოადგენს დემონს, რომელიც სისტემაში ფონურ რეჟიმად არის გაშვებული და
u.
ერ
ის ასრულებს გარკვეულ ბრძანებებს მოცემულ თარიღსა და დროში. cron ხშირად გამოიყენება
მუ
bt
სისტემის ადმინისტრირების დროს ამოცანების გაშვების ავრომატიზირებისთვის - როგორიცაა
მწ
li@
ან, თუნდაც, წარუმატებლად გაშვების/დამთავრების შემთხვევაში, შეტყობინებების გაგზავნა
მო
და ა.შ.
ის
რებელს შეუძლია cron-ს თავისი ამოცანა გადასცეს და ამისთვის ის იყენებს crontab ბრძანე-
sh
crontab ფაილში. ამისთვის, როგორც უკვე ვთქვით, ვიყენებთ crontab ბრძანებას -e ოფციით.
ნი
გავუშვათ.
liz
შე
achiko@debian:∼$ crontab -e
il.
ვთ
2. /usr/bin/vim.basic
ar
3. /usr/bin/vim.tiny
გთ
203
achiko@debian:∼$ export EDITOR=vi
achiko@debian:∼$ crontab -e
:
ზე
თითოეული ნიშნავს შემდეგს:
ა
achiko@debian:∼$ crontab -e
სტ
# ,------------------> წუთი
# | ,---------------> საათი
ა!
ო
# | | ,------------> თვის დღე
სი
ფ
# | | | ,---------> თვე (1=იანვარი,2=თებერვალი, ...)
# | | | | ,------> კვირის დღე(1=ორშაბათი,2=სამშაბათი, ...)
ge
# | | | | | ,---> გასაშვები ბრძანება
.
ელ
# | | | | | |
# | | | | | | ვე
u.
ო
ed
თ
1 2 3 * * echo "Hello Georgia" > /tmp/crontest.txt
შა
u.
ერ
მუ
bt
წუთი ნებისმიერი ნატურალური რიცხვია 0-დან 59-ის ჩათვლით.
მწ
სა
თვის დღე ნებისმიერი ნატურალური რიცხვია 1-დან 31-ის ჩათვლით (თვის დაკონკრე-
ის
ვაში 31 არ გამოგვადგება).
ბი
არ
sh
კვირის დღე ნებისმიერი ნატურალური რიცხვია 0-დან 7-ის ჩათვლით, სადაც 0 და 7 წარ-
ra
ეს
ba
liz
შე
ნიშნები: ფიფქი (*) ნებისმიერის აღსანიშნავად, ტირე (-) ინტერვალის აღსანიშნავად და მძიმე
il.
ვთ
204
*/15 3,4,5 * 2-12/2 1-5 cmd თებერვლიდან დაწყებული ყოველი მეორე თვის (ანუ თე-
ბერვალი, აპრილი, ივნისი ...) ყოველ დღე შაბათ-კვირის
გარდა ყოველ 3, 4 და 5 საათსა და ყოველ 15 წუთში შეს-
რულდეს cmd ბრძანება.
:
Crontab-ში დროის მარტივად მოსაცემად უკვე არსებობს მოკლე ჩანაწერები:
ზე
@reboot გაეშვას ერთხელ, სისტემის ჩართვის დროს
ა
სტ
@yearly გაეშვას წელიწადში ერთხელ: 0 0 1 1 *
ა!
ო
@monthly გაეშვას თვეში ერთხელ: 0 0 1 * *
სი
ფ
@weekly კვირაში ერთხელ: 0 0 * * 0
ge
.
@daily დღეში ერთხელ: 0 0 * * *
ელ
@midnight იგივეა რაც @daily ვე
u.
@hourly გაეშვას საათში ერთხელ: 0 * * * *
ო
ed
თ
შა
u.
ერ
მოდით, დავაკვირდეთ ჩვენს პირად დირექტორიას და გავარკვიოთ, ყოველდღიურად,
მუ
bt
6 საათში ერთხელ, თუ რომელი 5 ფაილი ან დირექტორია იკავებს ყველაზე დიდ ადგილს დის-
მწ
კზე. საბოლოოდ, მათი სია ფაილში ჩაწეროთ, რომელსაც სახელად მიმდინარე თარიღს დავარ-
სა
li@
ქმევთ.
მო
ის
achiko@debian:∼$ crontab -e
vi
sh
ნე
ტულად აღსაქმელად წინ \ უნდა მივუწეროთ. Crontab-დან გამოსვლის შემდეგ ეკრანზე ასეთი
შვ
შეტყობინება დაიწერება:
ba
ნი
liz
ეს იმას ნიშნავს, რომ კონფიგურაცია შეინახა ფაილში, რომელიც ძევს შემდეგ დირექ-
il.
ვთ
ar
achiko@debian:∼$ ls /var/spool/cron/crontabs/
ls: cannot open directory '/var/spool/cron/crontabs/': Permission denied
გთ
მიუხედავად ამისა, მომხმარებელს მაინც აქვს იმის უფლება, რომ ნახოს ან წაშალოს
თავის მიერ შექმნილი კონფიგურაციის ფაილი. ეს კი იმის წყალობით მიიღწევა, რომ ჩვეულებ-
რივი მომხმარებელი crontab ბრძანებას მისი მფლობელი ჯგუფის უფლებებით უშვებს (ანუ
მასზე SGID ბიტია გააქტიურებული).
205
achiko@debian:∼$ ls -l /usr/bin/crontab
-rwxr-sr-x 1 root crontab 40264 May 3 2015 /usr/bin/crontab
achiko@debian:∼$ crontab -l
:
ზე
ამ ბრძანებით შეგვიძლია ვნახოთ ჩვენი crontab-ის ფაილი.
ა
სტ
achiko@debian:∼$ crontab -r
ა!
ო
ასე კი წავშლით ჩვენსავე ფაილს. გადავამოწმოთ:
სი
ფ
achiko@debian:∼$ crontab -l
ge
no crontab for achiko
.
ელ
ვე
u.
ნაგულისხმევი მნიშვნელობით, cron-ის გამოყენება ყველა მომხმარებელს შეუძლია.
ანუ, მათ შეუძლიათ საკუთარი crontab შექმნან, სადაც ბრძანებების გაშვებას დაგეგმავენ სურ-
ო
ed
თ
ვილისებრ. მიუხედავად ამისა, root მომხმარებელი, რომელიც სისტემის ადმინისტრატორია,
შა
u.
ერ
ნისტრატორი ამ უფლებებს არეგულირებს /etc/cron.allow და /etc/cron.deny ფაილების
მუ
საშუალებით.
bt
თუ /etc/cron.allow ფაილი არსებობს, cron-ით სარგებლობა მხოლოდ ამ ფაილში
მწ
სა
sh
ველში მოიცემა.
e
il.
ვთ
# install the new version when you edit this file and files in /etc/cron.d.
ar
# These files also have username fields, that none of the other crontabs do.
გთ
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
...
206
ამას გარდა, /etc-ში, ნაგულისხმევი მნიშვნელობით, შექმნილია შემდეგი დირექტო-
რიები: cron.hourly/, cron.daily/, cron.weekly/ და cron.monthly/ და მათში ჩაწერილი
სკრიფტები თუ ბრძანებები გაეშვება, შესაბამისად, ყოველ საათში, ყოველდღიურად, ყოველკ-
ვირეულად და ყოველთვიურად.
როგორც წესი, cron-ში გაწერილი ამოცანების გაშვება ღამის საათებშია დაგეგმილი.
ეს ის დროა, როდესაც, ხშირ შემთხვევებში, კომპიუტერი გამორთულია და, შესაბამისად, cron
ვერ შეასრულებს მითითებულ ბრძანებებს. ასეთი შემთხვევების აღმოსაფხვრელად არსებობს
:
ზე
დემონი anacron. ის, ფაქტობრივად, ავსებს cron-ს და როგორც კი კომპიუტერი ჩაირთვება,
anacron ყველა დარჩენილ ამოცანას შეასრულებს.
ა
ასეთი გამოტოვებული ბრძანებების სია შეიძლება დიდი იყოს. ეს კი, კომპიუტერს
სტ
საგრძნობლად დატვირთავს ჩართვის შემდეგ, რომელიც მის მუშაობას შეანელბს. ამიტომ,
/etc/anacrontab ფაილში გაწერილი ამოცანები nice ბრძანებით ეშვება, რათა კომპიუტერ-
ა!
ო
მა მათ შესრულებაზე ნაკლები რესურსი დახარჯოს.
/etc/anacrontab-ის სინტაქსი განსხვავდება /etc/crontab ფაილის ჩანაწერისგან. მი-
სი
ფ
სი ხაზი შედგება 4 ველისგან: period delay job-identifier cmd, სადაც:
ge
.
ელ
Period
ვე
არის ამოცანის შესრულების სიხშირე მოცემული დღეებში. მაგ: 1 - ნიშნავს
u.
ყოველდღე, 5 - ხუთ დღეში ერთხელ.
ო
ed
თ
Delay აქ მოიცემა რიცხვი და ის აღნიშნავს წუთების რაოდენობას, რომლის გან-
შა
u.
ერ
Job-identifier ამოცანის დასახელება, რომელი სახელწოდებითაც ის log ფაილებში
მუ
ჩაიწერება.
bt
მწ
li@
მო
ის
vi
...
ra
ეს
შვ
ba
თების დონეზე, anacron - დღეებზე დაბლა ვერ ჩადის. cron დემონს იყენებს ჩვეულებრივი
შე
მომხმარებელიც და root-იც, ხოლო anacron მხოლოდ root-ის მიერ გამოიყენება (თუ სპეცია-
e
ch
ყურადღება!
ხო
ar
207
15.2 at
:
ზე
achiko@debian:∼$ at 22:00 19.07.2018
ა
at> touch /tmp/$(date +\%Y\%M)
სტ
at> <EOT>
job 1 at Thu Jul 19 16:46:00 2018
ა!
ო
სი
ფ
atq ბრძანებით (იგივეა, რაც at -l) ვნახულობთ თუ რა ბრძანებებია დაგეგმილი და რა
დროს. პირველ სვეტში კი ამოცანის ნომერია მოცემული.
ge
.
ელ
ვე
u.
achiko@debian:∼$ atq
1 Thu Jul 19 22:00:00 2018 a achiko
ო
ed
თ
შა
u.
ჯერ არ არის გაშვებული. არგუმენტად მას ამოცანის ნომერი უნდა მივუთითოთ.
ერ
მუ
bt
მწ
achiko@debian:∼$ atrm 1
სა
li@
achiko@debian:∼$ atq
მო
ის
ფორმატით გადავცეთ. მისაღები ფორმატებია (დავუშვათ მიმდინარე დრო არის 10:00 AM,
ბი
არ
sh
ra
ეს
ba
ar
208
2:30 PM tomorrow 2:30 PM October 19 2018
:
ზე
2:30 PM 10/21/2018 2:30 PM October 21 2018
ა
სტ
now + 30 minutes 10:30 AM October 18 2018
ა!
now + 1 hour
ო
now + 2 days 10:00 AM October 20 2018
სი
ფ
4 PM + 2 days 4:00 PM October 20 2018
ge
.
ელ
now + 3 weeks 10:00 AM November 8 2018
ვე
u.
now + 4 months 12:00 PM October 18 2018
ო
ed
now + 5 years 10:00 AM October 18 2023
თ
შა
u.
მისაღები დროის ფორმები მოცემულია /usr/share/doc/at/timespec ფაილში.
ერ
მუ
bt
ფაილებით რეგულირდება. თუ /etc/at.allow არსებობს, მხოლოდ მასში ჩაწერილ მომხმარებ-
მწ
ლებს აქვთ მისი გამოყენების უფლება, დანარჩენებს - არა. თუ ის არ არსებობს, მაშინ მოიძებ-
სა
li@
ნება /etc/at.deny ფაილი, და მისი არსებობის შემთხვევაში მასში ჩაწერილ მომხმარებლებს
მო
sh
სისტემის დატვირთვა 1.5-ზე ნაკლებია. შესაბამისად, დროის მითითება არგუმენტად აღარ არის
საჭირო.
ნე
ra
ეს
შვ
achiko@debian:∼$ batch
ba
at> <EOT>
შე
ar
გთ
209
გთ
ხო
ვთ ეს
ar შე არ
ch ნი ის
შვ სა
il. ნე
eliz ბი მუ
შა
ba მო ო
ra მწ ვე
sh ერ რ
vi
li@ ე თ
სი
ა!
bt ელ
u. .
ფ
ed ო
u. სტ
ge აზე
:
გთ
ხო
ვთ ეს
ar შე არ
ch ნი ის
შვ სა
il. ნე
eliz ბი მუ
შა
ba მო ო
211
ra მწ ვე ნაწილი II
sh ერ რ
vi
li@ ე თ
სი
ა!
Shell-ის სკრიფტები
bt ელ
u. .
ფ
ed ო
u. სტ
ge ა ზე
:
გთ
ხო
ვთ ეს
ar შე არ
ch ნი ის
შვ სა
il. ნე
eliz ბი მუ
შა
ba მო ო
ra მწ ვე
sh ერ რ
vi
li@ ე თ
სი
ა!
bt ელ
u. .
ფ
ed ო
u. სტ
ge აზე
:
თავი 16
:
ა ზე
შელის სკრიფტები
სტ
ა!
ო
სი
ფ
იგნის პირველ ნაწილში ჩვენ არაერთი ბრძანება განვიხილეთ (წინ უფრო მეტი გველის).
წ
რ
ge
დავრწმუნდით იმაშიც, რომ ბევრი ამოცანის გადაწყვეტა გაცილებით იოლია ბრძანებათა
.
ელ
ხაზიდან. რაც უფრო მეტს ვსწავლობთ ბრძანებათა ხაზში, მით მეტ პოტენციალს ვხედავთ
ვე
მასში. წარმოვიდგინოთ, რომ შეგვიძლია რამდენიმე ბრძანება გავაერთიანოთ შელში და
u.
ისე გავუშვათ. სწორედ ასე იქმნება შელის სკრიფტი. ის უბრალო ტექსტური ფაილია, რომელ-
ო
ed
თ
შიც ხაზ-ხაზ არის ჩაწერილი გასაშვები ბრძანებები. ყველაფერი, რისი გაშვებაც ბრძანებათა
ხაზიდან შეგვიძლია, შესაძლებელია სკრიპტიდანაც გავუშვათ. ასეთი მიდგომით მინიმუმ დროს
შა
u.
დავზოგავთ, რაც ძალიან მნიშვნელოვანია. თუმცა, ქვემოთ ვნახავთ, რომ შელის სკრიფტები
ერ
კიდევ უფრო მეტ შესაძლებლობასა და მოქნილობას გვთავაზობს.
მუ
bt
მწ
სა
li@
მო
16.1 ინტერპრეტატორები
ის
vi
რამას, რომელიც ასრულებს ჩვენ მიერ აკრეფილ ბრძანებებს. თუმცა შელი, სინამდვილეში,
sh
უფრო მეტია, ვიდრე ბრძანებათა ხაზის ინტერპრეტატორი. ის, თავის მხრივ, დაპროგრამების
ნე
Unix-ის ოჯახის სისტემებში პირველი shell კენ ტომპსონმა (Ken Thompson) შექმნა
ნი
liz
Bell Labs-ში და ის, ძირითადად, მე-7 ვერსიამდელ Unix-ებში გამოიყენებოდა. ყველაზე გავ-
შე
Bourne shell (sh) სტეფან ბურნმა (Stephen Bourne) შექმნა Bell Labs-ში (სინამდვი-
il.
და მე-7 ვერსიის Unix-ში გამოჩნდა. C shell (csh, მისი გაუმჯობესებული ვერსიაა tcsh) ბილ
ch
შელებია ასევე: Korn shell (ksh), Z shell (zsh), Almquist shell (ash) და Friendly interactive
shell (fish).
გთ
Bash ბრაიან ფოქსმა (Brian Fox) 1989 წელს GNU პროექტისთვის დაწერა. Bash დასა-
ხელება გამომდინარეობს Bourne Again SHell . ამ აკრონიმში ორი იდეაა ჩადებულია: პირვე-
”
ლი - Bash Bourne shell-ის თავისუფალი პროგრამული ჩანაცვლებაა და მეორე - მასში შელის
თავიდან დაბადების კონცეფციაა ნაგულისხმევი. Bash სრულიად თავსებადია POSIX სისტემას-
თან. მისი ფუნქციონალი გამდიდრებულია sh, csh და ksh ინტერპრეტატორებიდან.
213
16.2 პირველი shell სკრიფტი
:
ზე
მოტანისას ასე უფრო აღქმადი იქნება, რომ საქმე შელის სკრიფტს ეხება. თუმცა, გაფართოება
აუცილებელი ფაქტორი არ არის, მის გარეშეც შეგვიძლია სკრიფტი დავასათაუროთ. არ დავარ-
ა
ღვიოთ ტრადიცია და ჩვენი პირველი შელ სკრიფტით Hello World! გამოვიტანოთ ეკრანზე.
” ”
სტ
გავხსნათ script1.sh ფაილი ერთ-ერთ ტექსტური რედაქტორში და ავკრიფოთ:
ა!
ო
#!/bin/bash
სი
ფ
# ჩემი პირველი სკრიფტი
ge
.
echo "Hello World!"
ელ
ვე
u.
როგორც წესი, სკრიფტის პირველ ხაზზე იმ შელის გამშვები ფაილის სრულ გზას უთი-
ო
ed
თ
თებენ, რომლითაც გვსურს, რომ ქვემოთ აკრეფილი ბრძანებები შესრულდეს, ანუ - ინტერპრე-
შა
ტატორს. მის წინ კი #! ასო-ნიშნები აუცილებლად უნდა დავწეროთ. მას Shebang1 -ს უწო-
” ე
u.
ერ
დებენ და სწორედ მას მოსდევს იმ პროგრამის სახელი, რომელიც ინტერპრეტაციას უკეთებს
მუ
ჩვენს სკრიფტს. ჩვენს შემთხვევაში, ეს არის /bin/bash . შესაბამისად, ჩვენი სკრიფტი არის
bt
”
bash სკრიფტი. ამ მექნიზმს იყენებენ სკრიფტების სხვა ენებიც, როგორიცაა perl, awk, Tcl, Tk
მწ
სა
და python. შემდეგი ხაზი არის კომენტარი. ყველაფერი, რაც # სიმბოლოს შემდეგ არის ჩაწე-
li@
”
რილი (Shebang-ის გარდა), შესრულებისას უგულებელყოფილია შელის მიერ. როგორც წესი,
მო
vi
sh
ra
ეს
შვ
achiko@debian:∼$ ./script1.sh
liz
Hello World!
შე
ალბათ, დაგებადებათ კითხვა - რა საჭიროა ./ -ს მიწერა სკრიფტის წინ? ჩვენ ხომ მიჩ-
il.
ვთ
”
ვეულები ვართ, რომ, როდესაც რომელიმე ბრძანებას ვუშვებთ, მხოლოდ მის სახელს ვკრეფთ
ch
ადგილზე დადგება. როგორც ვიცით, PATH ცვლადში დირექტორიების სიაა მოცემული. ბრძანე-
ar
ბის გაშვებისას ჩვენი შელი სწორედ ამ ცვლადში მოცემულ დირექტორიებში ეძებს ამ ბრძანებას
და მხოლოდ მისი პოვნის შემთხვევაში შეძლებს მის გაშვებას. სხვა შემთხვევაში კი ბრძანების
გთ
214
ნაწერს. ./script1.sh ნიშნავს მიმდინარე დირექტორიაში არესებულ script1.sh ფაილს.
” ”
ანუ, სკრიფტს ვუშვებთ მისი ფარდობითი გზის მოცემით. აბსოლუტური გზის გამოყენებით, ასეც
შეგვიძლია გავუშვათ ჩვენი სკრიფტი:
achiko@debian:∼$ pwd
/home/achiko
:
achiko@debian:∼$ /home/achiko/script1.sh
ზე
Hello World!
ა
სტ
თუ გვსურს, რომ პირდაპირ, სახელის მითითებით შევძლოთ სკრიფტის გაშვება, მა-
შინ ჯობს ჩვენი სკრიფტები ერთ-ერთ დირექტორიაში მოვათავსოთ და ამ დირექტორიის გზა
ა!
PATH ცვლადს დავამატოთ. ამისთვის ხშირად პირად დირექტორიაში ქმნიან bin დასახელების
ო
დირექტორიას და მის სრულ გზას ამატებენ PATH ცვლადში.
სი
ფ
რადგან სკრიფტის გაშვების სხვასახვა ხერხებზე ვსაუბრობთ, ისიც ვიკითხოთ - რამდე-
ნად არის აუცილებელი სკრიფტში Shebang-ით ინტერპრეტატორის მითითება?
ge
.
თუ bash-ის სკრიფტი გვაქვს და ინტეპრეტატორად ტერმინალში bash არის გაშვებუ-
ელ
ვე
ლი, მაშინარ არის აუცილებელი სკრიფტში პირველი ხაზის განსაზღვრა. თუმცა, არ დაგვა-
”
u.
ვიწყდეს, რომ სკრიფტი Linux/Unix სისტემებში არის პორტატული. ის შეგიძლიათ ერთი სის-
ტემიდან მეორეში გადაიტანოთ და იქ გაუშვათ. ამისთვის კი აუცილებელია, სხვა სისტემაშიც
ო
ed
თ
იგივე შელი დაგხვდეთ. წინააღმდეგ შემთხვევაში სკრიფტი არ გაეშვება. ამ ყველაფრის თავი-
შა
u.
ერ
მუ
bt
16.3 გამოსახულების შეფასება
მწ
სა
li@
სკრიფტში ბრძანებების შესრულებამდე, ზოგჯერ საჭიროა გარკვეული გამოსახულების,
მო
vi
კურად ამის გაგება დასრულების კოდის საშუალებით არის შესაძლებელი. ჭეშმარიტი პასუხის
ნე
შემთხვევაში, დასრულების კოდს მიენიჭება რიცხვი 0, ხოლო სხვა შემთხვევაში 0-სგან გან-
ra
ეს
”
ch
achiko@debian:∼$ ls Tux.jpg
ხო
Tux.jpg
ar
achiko@debian:∼$ echo $?
გთ
0
achiko@debian:∼$ ls Tux.jpggg
ls: cannot access 'Tux.jpggg': No such file or directory
achiko@debian:∼$ echo $?
2
215
ამ მაგალითის პირველ შემთხვევაში ფაილი Tux.jpg ნამდვილად არსებობს და დას-
რულების კოდიც 0-ია, ხოლო მეორე შემთხვევაში Tux.jpggg ფაილი არ არსებობს და მისი
დასრულების კოდი 0-სგან განსხვავდება, კერძოდ, მისი მნიშვნელობაა 2. ჩვენთვის უკვე კარ-
გად ნაცნობი პირობითი ოპერატორები სწორედ ბრძანებების დასრულების კოდებს იყენებენ
იმის გასაგებად, ბრძანება წარმატებით დასრულდა თუ არა. თვალსაჩინოებისათვის შევადგი-
ნოთ შემდეგნაირი ბრძანება: თუ ეს ფაილი არსებობს, მაშინ ერთი ბრძანება შესრულდეს, ხოლო
თუ არ არსებობს, მაშინ - მეორე ბრძანება.
:
ზე
achiko@debian:∼$ ls Tux.jpg && echo "არსებობს" || echo "არ არსებობს"
ა
Tux.jpg
სტ
არსებობს
achiko@debian:∼$ ls Tux.jpggg && echo "არსებობს" || echo "არ არსებობს"
ა!
ო
ls: cannot access 'Tux.jpggg': No such file or directory
სი
ფ
არ არსებობს
ge
.
ელ
შეგვიძლია დასრულების კოდის მნიშვნელობებიც გამოვიტანოთ და ისე დავრწმუნდეთ
ზემოთ გაშვებული ბრძანებების მართებულობაში, ასე:
ვე
u.
ო
ed
თ
achiko@debian:∼$ ls Tux.jpg && echo "დასრულების კოდი არის $? " || echo
შა
u.
Tux.jpg
ერ
მუ
bt
achiko@debian:∼$ ls Tux.jpggg && echo "დასრულების კოდი არის $? " || echo
მწ
სა
vi
ბი
არ
სებობს წინასწარ შექმნილი ორი მარტივი ბრძანება: true და false. true ყოველთვის წარმა-
ნე
შვ
ba
liz
1
e
il.
ar
test Expression
216
achiko@debian:∼$ test -f Tux.jpg
achiko@debian:∼$
:
ზე
ნიშნავს, რომ შელმა პასუხი იცის, თუმცა ჩვენ არ გვითხოვია ჩვენთვისაც ეცნობებინა ის. თუ
გვსურს გავიგოთ შედეგი, შეგვიძლია ან გამოსასვლელი კოდის მნიშვნელობა ვნახოთ, ან პი-
ა
რობითი ოპერატორი გამოვიყენოთ, ასე:
სტ
achiko@debian:∼$ test -f Tux.jpg && echo "არსებობს" || echo "არ არსებობს"
ა!
ო
არსებობს
სი
ფ
test ბრძანება ხელმისაწვდომია [ დასახელებითაც და მის სრულიად იდენტურ ვერსიას
ge
.
წარმოადგენს, რომლის სინტაქსიც ასეთია:
ელ
ვე
u.
[ Expression ]
ო
ed
თ
შა
u.
ერ
achiko@debian:∼$ [ -f Tux.jpg ]
მუ
bt
არსებობს
მწ
სა
li@
მო
ყენება აუცილებელია. აქვე, არ უნდა დაგვავიწყდეს, რომ, რადგან [ ბრძანებაა, მის შემდეგ
vi
ra
achiko@debian:∼$ [ -f Tux.jpg]
ეს
შვ
[ ბრძანება წარმოადგენს bash-ის შიდა ბრძანებას. შიდა ბრძანება (ე.წ. builtin), სწრაფ-
e
217
achiko@debian:∼$ type test
test is a shell builtin
achiko@debian:∼$ type [
[ is a shell builtint
achiko@debian:∼$ type -a test
test is a shell builtin
:
test is /usr/bin/test
ზე
achiko@debian:∼$ type -a [
[ is a shell builtin
ა
[ is /usr/bin/[
სტ
achiko@debian:∼$ type cat
cat is /bin/cat
ა!
ო
სი
ფ
test ბრძანებას კიდევ ბევრი კრიტერიუმით შეუძლია გამოსახულების შემოწმება. მო-
დით, ვნახოთ ძირითადი მათგანი.
ge
.
ელ
შემოწმებები ფაილებზე ვე
u.
-e file ჭეშმარიტია თუ file არსებობს (მნიშვნელობა არ აქვს რომელი ტიპის).
ო
ed
თ
ჭეშმარიტია თუ file არსებობს და ის ჩვეულებრივი ტიპის ფაილია.
შა
-f file
ე
u.
ერ
-d file ჭეშმარიტია თუ file არსებობს და ის დირექტორიაა.
მუ
bt
-h file, ჭეშმარიტია თუ file არსებობს და ის მალსახმობია.
მწ
სა
-L file
li@
-r file ჭეშმარიტია თუ file არსებობს და მიმდინარე პროცესს მისი კითხვის
მო
უფლება აქვს.
ის
vi
უფლება აქვს.
sh
ნე
-u file
ბიტი.
ნი
liz
ბიტი.
e
bit.
ch
ჯგუფის წევრი.
file1 -nt file2 ჭეშმარიტია თუ file1 ახალია file2-ზე (საუბარია ფაილების შიგთავ-
სის ბოლო ცვლილების დროზე).
218
file1 -ot file2 ჭეშმარიტია თუ file1 ძველია file2-ზე (საუბარია ფაილების შიგთავ-
სის ბოლო ცვლილების დროზე).
file1 -ef file2 ჭეშმარიტია თუ file1 და file2 ერთსა და იმავე კვანძს (inode) იზია-
რებენ, ამაზე მოგვინებით ვისაუბრებთ. ახლა კი, უფრო გასაგები ენით
რომ ვთქვათ, ჭეშმარიტია თუ ეს ორი ფაილი ერთმანეთის ბმულია, ანუ
:
ფაილს ორი სხვადასხვა დასახელება აქვს file1-სა და file2-ის სახით.
ზე
მაგალითები:
ა
სტ
achiko@debian:∼$ [ -d Documents ] && echo "არსებობს" || echo "არ არსებობს"
ა!
ო
არსებობს
სი
ფ
რ
ge
.
achiko@debian:∼$ echo a > 1.txt
ელ
achiko@debian:∼$ echo b > 2.txt #ცხადია, 2.txt ფაილი 1.txt-ზე ახალია
ვე
u.
achiko@debian:∼$
achiko@debian:∼$ [ 2.txt -nt 1.txt ] && echo "2.txt უფრო ახალია" || echo
ო
ed
თ
"1.txt უფრო ახალია"
შა
u.
ერ
მუ
bt
achiko@debian:∼$ [ -s 1.txt ]; echo $?
მწ
სა
0
li@
achiko@debian:∼$ du -b 1.txt #გადავამოწმოთ მისი ზომა
მო
2 1.txt
ის
vi
ბი
არ
sh
შემოწმებები string-ებზე
ნე
ra
ეს
ასო-ნიშანს არ შეიცავს.
ნი
liz
ch
ar
მაგალითები:
გთ
219
achiko@debian:∼$ a="abc"
achiko@debian:∼$ [ -n $a ]; echo $?
0
achiko@debian:∼$ [ $a ]; echo $?
0
achiko@debian:∼$ [ -z $a ]; echo $?
:
1
ა ზე
achiko@debian:∼$ a="abc"
სტ
achiko@debian:∼$ b="xyz"
achiko@debian:∼$ [ $a = $b ]; echo $?
ა!
ო
1
სი
ფ
achiko@debian:∼$ [ $a=$b ]; echo $?
0
ge
.
achiko@debian:∼$ [ $a != $b ]; echo $?
ელ
0
ვე
u.
ო
ed
დაიმახსოვრეთ!
თ
შა
ე
String-ების შედარებისას ტოლობის ნიშნის წინ და შემდეგ გამოტოვება აუცილებელია!
u.
ერ
წინააღმდეგ შემთხვევაში შედარება სწორად არ მოხდება, რადგან გამოტოვებების გარე-
მუ
შე მიღებული გამოსახულება bash-ის მიერ არქმული იქნება როგორც სხვა, ერთი მთლი-
bt
მწ
ანი String.
სა
li@
მო
ის
vi
არითმეტიკული შემოწმებები
ბი
არ
sh
ba
ar
მაგალითები:
220
achiko@debian:∼$ [ 8 -eq 5 ]; echo $?
1
achiko@debian:∼$ a=39;b=12
achiko@debian:∼$ [ $a -ge $b ]; echo $?
:
0
ა ზე
test ბრძანებით შეგვიძლია, აგრეთვე, რამდენიმე გამოსახულება შევაფასოთ, ასე:
სტ
test Expression1 -a Expression2
ა!
ო
სი
ფ
ეს გამოსახულება ჭეშმარიტია თუ Expression1 და Expression2, ორივე, ჭეშმარიტია.
ან ასე:
ge
.
ელ
test Expression1 -o Expression2 ვე
u.
ო
ed
თ
ეს გამოსახულება კი ჭეშმარიტია მაშინ, როდესაც ერთ-ერთი გამოსახულება მაინც
შა
u.
ერ
მაგალითები:
მუ
bt
მწ
li@
0
მო
1
vi
sh
0
achiko@debian:∼$ [ 39 -ge 12 -a -f Tux.jpg -a 3 -lt 8 ]; echo $?
ნე
0
ra
ეს
ba
0
ნი
liz
სებლად test ბრძანება -a და -o ოფციებით, თუმცა ეს მეთოდი მიღებული აღარაა. მის ნაცვლად
e
ვიმოქმედოთ. შედეგიც იდენტური უნდა იყოს. ვნახოთ ამ ხერხით ჩაწერილი იგივე მაგალითები:
ch
ხო
0
გთ
221
0
achiko@debian:∼$ [ 39 -ge 12 ] && [ -f Tux.jpggg ] || [ 3 -lt 8 ]; echo $?
0
:
ზე
საძლებლობების მატარებელია. [[...]] სიტყვა-გასაღებია და არა ბრძანება. სიტყვა-გასაღები
არის დარეზერვებული სიტყვა ან ოპერატორი და ის, შიდა ბრძანებისგან განსხვავებით, არა
ა
მთლიანი ბრძანება, არამედ ბრძანების სტრუქტურის შემადგენელი ნაწილია. აღსანიშნავია
სტ
ისიც, რომ სადღეისოდ, ეს კონსტრუქცია POSIX ყველა შელის მიერ არ არის მხარდაჭერილი,
არამედ მხოლოდ KornShell, Zsh-სა და Bash-ის მიერ. [[ სიტყვა-გასაღებს ახალ test-საც
”
ა!
უწოდებენ.
ო
სი
ფ
achiko@debian:∼$ type [[
ge
[[ is a shell keyword
.
ელ
ვე
u.
[[ და [ -ს სინტაქსურ ჩანაწერებში ძალიან დიდი მსგავსებაა, თუმცა მაინც არის მათ
შორის გარკვეული განსხვავებები. იხილეთ შედარებითი ცხრილი მაგალითებით:
ო
ed
თ
შა
შეფასება [[ [ მაგალითი ე
u.
ერ
მუ
\ >2
bt
> [[ a > b ]] || echo "a არ მოდის b-ს შემდეგ"
მწ
2
\<
სა
vi
sh
-lt -lt
ra
შვ
რიცხვების
შედარება -le -le [[ 3 -le 8 ]] && echo "3 ნაკლებია ან ტოლი 8-ს"
ნი
liz
შეფასება
|| -o3
ch
3
დაჯგუფება (...) \(...\) [[ $v = img* && ($v = *.png || $v = *.jpg) ]] && echo
ar
222
16.4 გადაწყვეტილების მიღება
:
ზე
არსებობს. ესენია:
ა
if ... fi
სტ
ა!
და
ო
სი
ფ
case ... esac
ge
.
ელ
ორივე, if-ც და case-ც, სიტყვა-გასაღებს წარმოადგენს. განვიხილოთ თითოეული მათ-
განი დეტალურად. ვე
u.
ო
ed
თ
16.4.1 სიტყვა-გასაღები if
შა
u.
ერ
მუ
ა)
bt
მწ
li@
then # მაშინ
მო
...
ბი
არ
ra
ბ)
ეს
შვ
then # მაშინ
ნი
...
შე
...
ვთ
გ)
ar
then # მაშინ
cmd1; ... # შესრულდეს ბრძანება cmd1 ...
2
ეს არის POSIX სტანდარტის გაფართოება. ზოგი შელი შეიცავს მას, ზოგიც არა.
3
მისი გამოყენება აღარ არის რეკომენდებული! მის ნაცვლად მიზანშეწონილია რამდენიმე [ ბრძანების გამოყენება.
223
elif Command2 ; # თუ არა, შემოწმდეს Command2.
then # თუ ის ჭეშმარიტია, მაშინ
cmd2; ... # შესრულდეს ბრძანება cmd2 ...
.
.
.
:
else # წინააღმდეგ შემთხვევაში
ზე
cmdN; ... # შესრულდეს ბრძანება cmdN
ა
fi # if-ს ვხურავთ fi-თი
სტ
ამ სინტაქსური ჩანაწერიდან კარგად ჩანს, რომ if ბრძანება არ არის, არამედ სიტყვა-
ა!
ო
გასაღებია, რადგან მას fi სუფიქსი სჭირდება დასახურად. if-ის შემდეგ შესამოწმებელი ბრძა-
ნება ნებისმიერი შეიძლება იყოს, მათ შორის ჩვენთვის უკვე კარგად ნაცნობი test ბრძანებაც.
სი
ფ
if ... fi სიტყვა-გასაღების კონსტრუქცია, როგორც ვხედავთ, მრავალ ხაზზე არის ჩაწერილი.
ასეთი ფორმა კოდის უკეთ კითხვადობას უწყობს ხელს, განსაკუთრებით მაშინ, როდესაც კოდი
ge
.
ელ
საკმაოდ გრძელია. თუმცა, მისი ჩაწერა ერთ ხაზზეც არის შესაძლებელი. სწორედ, ამ დროს
ვე
არის აუცილებელი წერტილ-მძიმეს (;) ბოლოში მიწერა. მრავალ ხაზიან ჩანაწერში წერტილ-
u.
მძიმეს გამოყენება აუცილებელი აღარ არის!
ო
ed
მაგალითები:
თ
შა
u.
achiko@debian:∼$ vi script.sh
ერ
მუ
#!/ bin/bash
bt
მწ
სა
li@
file =/ etc/ passwd
მო
if [[ -e $file ]]
ის
vi
then
ბი
sh
fi
ნე
achiko@debian:∼$ ./script.sh
შვ
liz
ფაილი არსებობს!"; fi
პაროლების ფაილი არსებობს!
ch
ხო
ar
#!/ bin/bash
x=8
y=17
224
if [ $x -eq $y ]
then
echo "$x ტოლია $y-ის"
else
echo "$x არ არის $y-ის ტოლი!"
fi
:
ზე
achiko@debian:∼$ ./script XYZ.sh
8 არ არის 17-ის ტოლი!
ა
სტ
#!/ bin/bash
ა!
ო
x=18
სი
ფ
if [ $x -eq 100 ]
then
ge
.
ელ
echo "x 100 -ის ტოლია"
elif [ $x -gt 100 ]
ვე
u.
then
ო
ed
echo "x 100 -ზე მეტია"
თ
else
შა
u.
ერ
fi
მუ
bt
achiko@debian:∼$ ./script XYZ.sh
მწ
x 100-ზე ნაკლებია
სა
li@
მო
vi
ბი
არ
#!/ bin/bash
sh
file =/ bin
ნე
if [ -e $file ]
ra
ეს
then
შვ
if [ -h $file ]
ba
then
ნი
elif [ -d $file ]
შე
then
e
elif [ -f $file ]
then
ch
else
ar
fi
else
echo "$file არ არსებობს!"
fi
225
achiko@debian:∼$ ./script XYZ.sh
/bin დირექტორიაა.
:
achiko@debian:∼$ file=/bin; if [ -e $file ]; then if [ -h $file ]; then echo
ზე
"$file მალსახმობია."; elif [ -d $file ]; then echo "$file დირექტორიაა.";
elif [ -f $file ]; then echo "$file ჩვეულებრივი ტიპის ფაილია."; else echo
ა
სტ
"$file სხვა ტიპის ფაილია!"; fi; else echo "$file არ არსებობს!"; fi
/bin დირექტორიაა.
ა!
ო
ცალსახაა, რომ სკრიფტის წასაკითხად და მასში ცვლილების შესტანად მისი მრავალ
სი
ფ
ხაზზე ჩაწერა გაცილებით მოსახერხებელია!
ge
.
ელ
16.4.2 სიტყვა-გასაღები case
ვე
u.
if ... elif ... fi კონსტრუქცია შეგვიძლია, ბევრჯერ გამოვიყენოთ, როდესაც
მრავალი პირობის შემოწმება გვჭირდება. თუმცა ეს მიდგომა არაა საუკეთესო, მითუმეტეს იმ
ო
ed
თ
შემთხვევაში, როდესაც ერთი ცვლადის მნიშვნელობაზეა დამოკიდებული ეს პირობები და ამ
შა
ე
ცვლადთან შედარება მრავალჯერ გვიწევს. ასეთ სიტუაციებშია მართებული case ... esac
u.
ერ
კონსტრუქციის გამოყენება. მისი სინტაქსური ჩანაწერი შემდეგნაირია:
მუ
bt
მწ
li@
pattern1 ) # pattern1-ს, მაშინ
მო
.
ra
ეს
.
შვ
.
ba
*) # წინააღმდეგ შემთხევევაში
ნი
რი ჩანაწერის მაგალითებია:
გთ
226
*.txt) იწყება ნებისმიერი ასოთა წყობით და მთავრდება .txt-ით.
:
ზე
გენს.
ა
ვნახოთ case სიტყვა-გასაღების გამოყენების ერთ-ერთი მაგალითი. შევიყვანოთ კლავიატური-
სტ
დან ერთ ასო-ნიშანი და სკრიფტმა გამოიცნოს ის პატარა ასოა თუ დიდი, ციფრია თუ პუნქტუა-
ციის ნიშანია და ა.შ.
ა!
ო
მოდით, ჯერ ვნახოთ, როგორ ხდება კლავიატურიდან მონაცემის შეყვანა შელში. ამის-
თვის გამოიყენება read ბრძანება. ის იღებს კლავიატურიდან შეტანილ მონაცემს და ინახავს
სი
ფ
არგუმენტად გადაცემულ ცვლადში. კლავიატურიდან მონაცემების შეტანა მანამ გრძელდება,
სანამ შეყვანის ღილაკს არ დავაჭერთ ( Enter , ).
ge
.
ელ
ვე
u.
achiko@debian:∼$ read x
Data
ო
ed
თ
achiko@debian:∼$ echo $x
შა
Data
ე
u.
ერ
მუ
bt
ნაგულისხმევი მნიშვნელბით, REPLY ცვლადში შეინახავს.
მწ
სა
li@
მო
achiko@debian:∼$ read
ის
Data
vi
sh
Data
ნე
ra
შვ
ba
#!/ bin/bash
ნი
liz
read Key
e
il.
ვთ
case "$Key" in
[[: lower :]])
ch
;;
ar
227
[[: punct :]])
echo "პუნქტუაციის ნიშანი"
;;
[[: xdigit :]])
echo "თექვსმეტობითი თვლის სისტემის ასო-ნიშანი"
;;
:
*)
ზე
echo "სხვა"
ა
;;
სტ
esac
ა!
ო
achiko@debian:∼$ ./script XYZ.sh
სი
ფ
შემოიტანეთ ერთი სიმბოლო:
ge
.
h
ელ
პატარა ასო
ვე
u.
ო
ed
თ
უფრო კომპაქტურად ეს კოდი ასეც ჩაიწერება:
შა
u.
ერ
#!/ bin/bash
მუ
bt
echo; echo "შემოიტანეთ ერთი სიმბოლო:"
მწ
სა
read Key
li@
მო
case "$Key" in
ის
sh
ra
შვ
* ) echo "სხვა";;
ba
esac
ნი
liz
”
ch
ხო
F
დიდი ასო
228
მის წინ მოცემული ერთი-ერთი კრიტერიუმი უკვე დაკმაყოფილდა. თუ გვსურს, რომ case ...
esac კონსტრუქციაში მრავალი კრიტერიუმი შემოწმდეს ერთდროულად, მაშინ მასში ;; -ის
”
ნაცვლად ;;& ჩანაწერი უნდა გამოვიყენოთ, ასე:
”
#!/ bin/bash
:
echo; echo "შემოიტანეთ ერთი სიმბოლო"
ზე
read Key
ა
case "$Key" in
სტ
[[: lower :]] ) echo "პატარა ასო";;&
[[: upper :]] ) echo "დიდი ასო";;&
ა!
ო
[[: digit :]] ) echo "ციფრი";;&
სი
ფ
[[: punct :]] ) echo "პუნქტუაციის ნიშანი";;&
[[: xdigit :]] ) echo "თექვსმეტობითი სისტემის ასო-ნიშანი";;&
ge
esac
.
ელ
ვე
u.
achiko@debian:∼$ ./script XYZ.sh
ო
ed
თ
შა
u.
F
ერ
მუ
დიდი ასო
bt
თექვსმეტობითი თვლის სისტემის ასო-ნიშანი
მწ
სა
li@
მო
vi
sh
ra
ეს
#!/ bin/bash
შვ
case $NOW in
ნი
Mon|Tue|Wed|Thu|Fri)
liz
echo "ორშაბათი-პარასკევი";;
შე
Sat|Sun)
e
*)
echo "რეგ. პარამეტრები ინგლისურ ენაზე არაა ან სხვა!";;
ch
esac
ხო
ar
სანამ სხვა საკითხზე გადავალთ, მოდით, read ბრძანებას დავუბრუნდეთ და მისი გა-
გთ
229
achiko@debian:∼$ read a b c
Data1 Data2 Data3
achiko@debian:∼$ echo $a
Data1
achiko@debian:∼$ echo $b
Data2
:
achiko@debian:∼$ echo $c
ზე
Data3
ა
სტ
achiko@debian:∼$ read x y
Data11 Data22 Data33
ა!
ო
achiko@debian:∼$ echo $x
სი
ფ
Data11
achiko@debian:∼$ echo $y
ge
.
Data22 Data33
ელ
ვე
u.
-p ოფციით შესაძლებელია, გარკვეული ტექსტი წავუმძღვაროთ კლავიტაურიდან მო-
ნაცემის შეტანას, ასე:
ო
ed
თ
შა
u.
achiko@debian:∼$ read -p "შემოიტანე შენი სახელი: "x
ერ
შემოიტანე შენი სახელი: Achiko
მუ
bt
achiko@debian:∼$ echo $x
მწ
Achiko
სა
li@
მო
ლებელია, უფრო მეტი სიმბოლო ავკრიფოთ კლავიატურაზე, თუმცა read ავტომატურად შე-
vi
წყვეტს ზღვარს მიღმა მითითებული სიმბოლოების მიღებას. ღილაკზე დაჭერა საჭირო არ
ბი
არ
sh
არის.
ნე
ra
ეს
123
ნი
liz
ები (ჩვენს შემთხვევაში - 45) შელის მოსაწვევზე ჩაიწერება და თუ ღილაკსაც დავაჭერთ,
e
ის ბრძანებად აღიქმება:
il.
ვთ
ch
230
achiko@debian:∼$ read -s -p "შემოიტანე პაროლი: "x
შემოიტანე პაროლი: achiko@debian:∼$
achiko@debian:∼$ echo $x
Password
:
ზე
როგორც ვნახეთ, ეკრანზე აკრეფილი პაროლი არ გამოჩნდა.
ა
16.5 ციკლი
სტ
შელში, როგორც, ზოგადად, დაპროგრამების ყველა ენაში, ციკლი გამოიყენება გარ-
ა!
ო
კვეული ბრძანებების დაჯგუფების გამეორებისთვის, იტერაციისთვის. ციკლის ჩასაწერად არ-
სი
ფ
სებობს რამდენიმე საშუალება: for, while და until სიტყვა-გასაღებები.
განვიხილოთ, დეტალურად თითოეული მათგანი.
ge
.
ელ
16.5.1 ციკლი for
ვე
u.
for-ის სინტაქსი ასეთია:
ო
ed
თ
შა
u.
ერ
do
მუ
cmd1;
bt
cmd2;
მწ
სა
li@
...
done
მო
ის
vi
list-ში. იგი შეიძლება იყოს გამოტოვებით ან ახალი ხაზით გამოყოფილი ნებისმიერი მონაცე-
ra
ეს
სხვადასხვა ვარიაცია:
liz
შე
#!/ bin/bash
e
for i in a b c
il.
ვთ
do
ch
echo $i
ხო
done
ar
გთ
#!/ bin/bash
x="a b c"
for i in $x
do
231
echo $i
done
#!/ bin/bash
:
x="a
ზე
b
c"
ა
for i in $x
სტ
do
echo $i
ა!
ო
done
სი
ფ
რ
ge
.
#!/ bin/bash
ელ
for i in $( echo a b c)
ვე
u.
do
echo $i
ო
ed
თ
done
შა
u.
ერ
მუ
bt
#!/ bin/bash
მწ
for i in {a..c}
სა
li@
do
მო
echo $i
ის
done
vi
ბი
არ
sh
ra
ეს
ba
a
b
ნი
c
liz
შე
a
ხო
b
ar
c
გთ
232
საიდანაც ვუშვებთ სკრიფტს.
#!/ bin/bash
for i in *
do
echo $i
:
done
ზე
achiko@debian:∼$ ./script XYZ.sh
ა
...
სტ
Desktop
distros.txt
ა!
Documents
ო
Downloads
სი
ფ
GPL-3
...
ge
.
ელ
ვე
მოდით, ახლა ამ ფაილების შესახებ დეტალური ინფორმაცია გამოვიტანოთ:
u.
ო
ed
თ
#!/ bin/bash
for i in *
შა
u.
do
ერ
ls -ld $i
მუ
bt
done
მწ
სა
sh
ra
...
ეს
შვ
ba
ეს მარტივი სკრიფტი, ერთი შეხედვით, სწორად მუშაობს. მოდით ახლა, ერთი ახალი
ნი
ჩვენი სკრიფტი.
შე
233
გორ ხდება. * -ს მითითებით for-ს გადავეცით მიმდინარე დირექტორიაში არსებული ფაილე-
”
ბის სია. მათი დასახელებები გამოტოვებითაა მოცემული. for პირველ იტერაციაზე i ცვლადს
პირველი ფაილის სახელს მიანიჭებს და ls -ld ბრძანებას გადასცემს არგუმენტად, მეორე
იტერაციაზე i ცვლადს მეორე ფაილის სახელი მიენიჭება და ა.შ. იმ იტერაციაზე, როდესაც i
ცვლადში erti ori ფაილის სახელი წერია, ის ls -ld ბრძანებას გადაეცემა. ეს ბრძანება მას
ორ სხვადასხვა არგუმენტად აღიქვამს. ასეთი დასახელების ცალკე ფაილები კი არ გაგვაჩნია.
შესაბამისად, შედეგიც ლოგიკურია. ამ ყველაფრის თავიდან ასაცილებლად, შეგვიძლია, ცვლა-
:
ზე
დი ბრჭყალებში ჩავსვათ, მარტივად. ასე:
ა
#!/ bin/bash
სტ
for i in *
do
ა!
ო
ls -ld "$i"
სი
ფ
done
achiko@debian:∼$ ./script XYZ.sh
ge
.
...
ელ
drwxr-xr-x 2 achiko achiko 4096 Oct 10 2017 Downloads
ვე
u.
-rw-r--r-- 1 achiko achiko 0 May 30 12:04 erti ori
-rw-r--r-- 1 achiko achiko 35147 Jun 26 2018 GPL-3
ო
ed
თ
...
შა
u.
ერ
ასე უკვე, ყველაფერი თავის ადგილზე დადგა.
მუ
bt
დაიმახსოვრეთ!
მწ
სა
li@
თუ ფაილების დასახელება ცვლადში გაქვთ შენახული, ამ ცვლადის გამოყენებისას, ის
მო
vi
sh
ra
ენაში იყენებენ ხოლმე. მას სამი გამოსახულება გადაეცემა (დაწყება, პირობა და განახლება).
ეს
ba
ნი
do
შე
cmd1;
e
cmd2;
il.
...
ვთ
done
ch
ხო
#!/ bin/bash
for ((i=1;i <=20; i=i+2)) # i-ვანიჭებთ 1-ს. სანამდე i<=20, ამ ცვლადს
do # 2-ით ვზრდით ყოველი იტერაციის დროს
echo -n "$i "
234
done # როგორც კი i>20 for ციკლი დასრულდება და
echo # შესრულდება done-ის შემდეგ ჩაწერილი ბრძანება
achiko@debian:∼$ ./script XYZ.sh
1 3 5 7 9 11 13 15 17 19
:
ზე
#!/ bin/bash
read -p "შემოიტანე რიცხვი 1-დან 10-მდე: " a
ა
for (( i=1; i <=$a; i++ ))
სტ
do
for (( j=1; j <=$i; j++ ))
ა!
ო
do
echo -n $j
სი
ფ
done
echo
ge
.
done
ელ
achiko@debian:∼$ ./script XYZ.sh
ვე
u.
შემოიტანე რიცხვი 1-დან 10-მდე: 5
ო
ed
1
თ
22
შა
333
ე
u.
ერ
4444
მუ
bt
55555
მწ
სა
li@
მო
16.5.2 break
ის
sh
ra
ეს
#!/ bin/bash
შვ
ba
for outerloop in 1 2 3 4 5
ნი
do
liz
for innerloop in 1 2 3 4 5
e
do
il.
then
ხო
break
ar
fi
გთ
done
echo
done
exit 0
achiko@debian:∼$ ./script XYZ.sh
235
გარე ციკლი 1 => შიდა: 1 2 3
გარე ციკლი 2 => შიდა: 1 2 3
გარე ციკლი 3 => შიდა: 1 2 3
გარე ციკლი 4 => შიდა: 1 2 3
გარე ციკლი 5 => შიდა: 1 2 3
:
ზე
მისი ზოგადი სინტაქსი ასეთია: break N, სადაც N დადებითი რიცხვია. როდესაც ციკლში
სხვა ციკლი რამდენჯერმე გვაქვს ჩაშენებული, სასარგებლოა რიცხვის არგუმენტად გადაცემა
ა
და ის მიუთითებს, თუ რამდენი ციკლიდან უნდა მოხდეს გამოსვლა. ვნახოთ მაგალითი:
სტ
#!/ bin/bash
ა!
ო
სი
ფ
for outerloop in 1 2 3 4 5
do
ge
.
echo -n "გარე ციკლი $ outerloop => შიდა: "
ელ
for innerloop in 1 2 3 4 5
ვე
u.
do
echo -n "$ innerloop "
ო
ed
თ
if [ "$ innerloop " -eq 3 ]
შა
then
ე
u.
break 2
ერ
მუ
fi
bt
done
მწ
სა
echo
li@
done
მო
exit 0
ის
sh
ნე
#!/ bin/bash
e
il.
ვთ
for outerloop in 1 2 3 4 5
ch
do
ხო
for innerloop in 1 2 3 4 5
do
გთ
236
fi
done
echo
done
exit 0
achiko@debian:∼$ bash -x script XYZ.sh
:
ზე
+ for outerloop in 1 2 3 4 5
+ echo -n 'გარე ციკლი 1 => შიდა: '
ა
გარე ციკლი 1 => შიდა: + for innerloop in 1 2 3 4 5
სტ
+ echo -n '1 '
1 + '[' 1 -eq 3 ']'
ა!
ო
+ for innerloop in 1 2 3 4 5
+ echo -n '2 '
სი
ფ
2 + '[' 2 -eq 3 ']'
+ for innerloop in 1 2 3 4 5
ge
.
+ echo -n '3 '
ელ
3 + '[' 3 -eq 3 ']'
ვე
u.
+ break 2
+ echo
ო
ed
თ
შა
+ exit 0
ე
u.
ერ
მუ
bt
დეტალურად გამოჩნდა თუ რომელ ბრძანებას, როდის უშვებს ინტერპრეტატორი და
მწ
li@
მო
დაიმახსოვრეთ!
ის
vi
sh
16.5.3 continue
ნე
ra
ეს
შვ
საც. თუ break მთლიანი ციკლიდან გამოდის, continue მხოლოდ ციკლის მიმდინარე იტერაცი-
ნი
გაშვება შემდეგ იტერაციაზე გაგრძელდეს. დავბეჭდოთ 1-დან 10-მდე რიცხვები 3-სა და 6-ის
e
გამოტოვებით:
il.
ვთ
#!/ bin/bash
ch
ხო
i=0
ar
while [ $i -lt 10 ]
გთ
do
i=`expr $i + 1`
if [ $i -eq 3 ] || [ $i -eq 6 ]
then
continue
237
fi
echo -n "$i "
done
echo
exit 0
achiko@debian:∼$ ./script XYZ.sh
:
ზე
1 2 4 5 7 8 9
ა
N არგუმენტი continue-საც შეგვიძლია გადავცეთ. continue N ბრძანება გამოტოვებს
სტ
მიმდინარე ციკლის ყველა დარჩენილ იტერაციას და გადავა N დონით წინა ციკლის შემდეგ
იტერაციაზე. მაგალითი:
ა!
ო
სი
ფ
#!/ bin/bash
ge
.
for outerloop in 1 2 3 4 5
ელ
do
ვე
u.
echo; echo -n "გარე ციკლი $ outerloop => შიდა: "
for innerloop in {1 ..10}
ო
ed
თ
do
შა
u.
then
ერ
მუ
continue 2
bt
fi
მწ
სა
done
ის
echo
vi
exit 0
ბი
არ
sh
ch
#!/ bin/bash
ხო
ar
for outerloop in 1 2 3 4 5
do
გთ
238
then
continue 1
fi
echo -n "$ innerloop "
done
done
:
echo
ზე
exit 0
ა
achiko@debian:∼$ ./script XYZ.sh
სტ
გარე ციკლი 1 => შიდა: 1 2 3 4 5 6 7 8 9 10
გარე ციკლი 2 => შიდა: 1 2 3 4 5 6 7 8 9 10
ა!
ო
გარე ციკლი 3 => შიდა: 1 2 3 4 5 7 8 9 10
გარე ციკლი 4 => შიდა: 1 2 3 4 5 6 7 8 9 10
სი
ფ
გარე ციკლი 5 => შიდა: 1 2 3 4 5 6 7 8 9 10
ge
.
ელ
დაიმახსოვრეთ!
ვე
u.
continue 1 იგივე შედეგს გვაძლევს, რასაც continue ბრძანება.
ო
ed
თ
შა
u.
16.5.4 ციკლი while
ერ
მუ
bt
მწ
li@
მო
do
vi
sh
შვ
ba
liz
#!/ bin/bash
შე
x=1
e
while [ $x -le 5 ]
il.
ვთ
do
echo $x
ch
x=$(($ x+1))
ხო
done
ar
1
2
3
4
5
239
ამ მაგალითში მოდით, დეტალურად გავშიფროთ x=$(($x+1)) ჩანაწერი. x ცვლადში
დამახსოვრებული გვაქვს რიცხვი - 1. შესაბამისად, $x+1 არითმეტიკულ გამოსახულებას წარ-
მოადგენს, რომელსაც გამოთვლა სჭირდება. ამისთვის, ეს გამოსახულება $((...)) ან $[...]
სტრუქტურაში უნდა მოვაქციოთ. საბოლოოდ, x ცვლადში ვწერთ მის წინა მნიშვნელობაზე 1-ით
მეტ მნიშვნელობას. ანუ, ვაკეთებთ ცვლადის ინკრიმენტს 1-ით.
while ხშირად გამოიყენება სკრიფტიდან ფაილის შიგთავსის ხაზ-ხაზ ამოღებისას. ასე:
:
ზე
#!/ bin/bash
ა
File =$ HOME/ countries.txt
სტ
while read line
do
ა!
echo $line
ო
done <"$File"
სი
ფ
achiko@debian:∼$ ./script XYZ.sh
Georgia 1
ge
.
France 2
ელ
USA 3
ვე
u.
Germany 4
Great Britain 5
ო
ed
თ
შა
ე
ცხადია, ეს სკრიფტი ერთ ხაზშიც შეიძლება ჩავწეროთ:
u.
ერ
მუ
bt
achiko@debian:∼$ while read -r line; do echo $line; done<countries.txt
მწ
სა
Georgia 1
li@
France 2
მო
USA 3
ის
Germany 4
vi
Great Britain 5
ბი
არ
sh
ნე
ra
ეს
ba
liz
შე
...
ხო
მათ შორის განსხვავება შემდეგია: while-ის შემთხვევაში do ... done ბლოკში ჩა-
გთ
240
#!/ bin/bash
x=1
until [ $x -gt 5 ]
do
echo $x
x=$(($ x+1))
:
done
ზე
achiko@debian:∼$ ./script XYZ.sh
ა
1
სტ
2
3
ა!
4
ო
5
სი
ფ
რა თქმა უნდა, პირობა ისე შეიძლება შევარჩიოთ, რომ ციკლი უსასრულოდ გაგრძელ-
ge
.
დეს. while-ის შემთხვევაში, ნებისმიერი მუდმივად ჭეშმარიტი ბრძანება უნდა გამოვიყენოთ,
ელ
ვე
until-ის შემთხვევაში კი - მუდმივად მცდარი ბრძანება. მუდმივი ციკლიდან გამოსვლა Ctrl^c
u.
კლავიშების კომბინაციით შეიძლება.
ო
ed
თ
შა
u.
ერ
მუ
bt
#!/ bin/bash
მწ
li@
do
მო
done
vi
sh
...
TEST
ნე
TEST
ra
ეს
...
შვ
ba
ნი
#!/ bin/bash
liz
done
ch
ხო
ar
#!/ bin/bash
while [ მიშკა ] # მიშკა ყოველთვის ჭეშმარიტია
გთ
do
echo TEST; sleep 1
done
241
#!/ bin/bash
while sleep 1
do
echo TEST
done
:
ზე
#!/ bin/bash
ა
while : # ":" ყველაზე მარტივი ფორმაა მუდმივი ციკლის ჩასაწერად
სტ
do
echo TEST; sleep 1
ა!
ო
done
სი
ფ
რ
ge
.
#!/ bin/bash
ელ
for ((;;)) # ცარიელი პირობებით for ყოველთვის ჭეშმარიტია
ვე
u.
do
echo TEST; sleep 1
ო
ed
თ
done
შა
u.
ერ
მუ
#!/ bin/bash
bt
until false
მწ
სა
li@
do
მო
vi
ბი
არ
sh
”
ra
ნიშნავს (null command ან NOP, no op, do-nothing ოპერაცია). ანუ, ეს ბრძანება არაფერს
ეს
შვ
მივიჩნიოთ.
ნი
რომ გავუშვათ, დავინახავთ, რომ შელი დაიხურება. ის შელიდან გამოსვლას ნიშნავს. სკრიფ-
შე
ტში მისი გამოყენება კი ამ სკრიფტის დახურვას გამოიწვევს. მას შეგვიძლია პარამეტრად გა-
e
დავცეთ რიცხვი - exit N. ეს იმას ნიშნავს, რომ შელის დახურვის გამოსასვლელი კოდი სწო-
il.
ვთ
მიერ.
ar
გთ
achiko@debian:∼$ exit
242
შვილ პროცესად:
achiko@debian:∼$ bash
achiko@debian:∼$ ps -jH
PID PGID SID TTY TIME CMD
11168 11168 11168 pts/0 00:00:00 bash
:
11880 11880 11168 pts/0 00:00:00 bash
ზე
11885 11885 11168 pts/0 00:00:00 ps
achiko@debian:∼$ exit
ა
achiko@debian:∼$ echo $?
სტ
0
achiko@debian:∼$ bash
ა!
ო
achiko@debian:∼$ exit 15
სი
ფ
achiko@debian:∼$ echo $?
15
ge
.
ელ
ვე
u.
16.5.6 ციკლი select
ო
ed
select ბაშში სიტყვა-გასაღებს წარმოადგენს და ის ძალიან სასარგებლოა მენიუების
თ
შესაქმნელად. მისი სინტაქსი შემდეგნაირია:
შა
u.
ერ
მუ
bt
do
მწ
სა
cmd1;
li@
cmd2;
მო
...
ის
done
vi
ბი
არ
sh
liz
#!/ bin/bash
შე
echo " Select a country where do you want to spend this summer ?"
il.
ვთ
ch
done
გთ
243
4) Spain
5) USA
#? 3
You choose: Georgia
#? 1
You choose: France
:
#? 4
ზე
You choose: Spain
...
ა
#? ^C
სტ
ა!
მენიუდან არჩევანის გაკეთების შემდეგ select კვალავ შემოგვთავაზებს სიას და ეს
ო
პროცესი მუდმივად გაგრძელდება. ამიტომ Ctrl^c კლავიშების კომბინაცია დაგჭირდებათ
სი
ფ
გამოსასვლელად. თუ მხოლოდ ერთი არჩევანის გაკეთება გვსურს, შეგვიძლია, ციკლიდან გა-
მოსასვლელად break ბრძანება გამოვიყენოთ. ასევე შესაძლებელია PS3 ცვლადის გამოყენება,
ge
.
რომლითაც შევცვლით მენიუს მოსაწვევის ტექსტს (#?-ის ნაცვლად), ასე:
ელ
ვე
u.
#!/ bin/bash
ო
ed
თ
PS3=" Input number : "
შა
ე
echo " Select a country where do you want to spend this summer ?"
u.
ერ
მუ
bt
select country in France Germany Georgia Spain USA
მწ
do
სა
li@
echo "Your choice is $ country "
მო
break
ის
done
vi
1) France
ნე
2) Germany
ra
ეს
3) Georgia
შვ
4) Spain
ba
5) USA
ნი
Input number: 3
liz
achiko@debian:∼$
e
il.
ვთ
ar
#!/ bin/bash
გთ
244
select country in France Georgia Spain
do
PS3=" Select City/ Region / Province : "
echo "What region do you prefer to visit in $ country ?"
case $ country in
France )
:
select region in Paris Bretagne Normandie ...
ზე
do
ა
break
სტ
done
;;
ა!
Georgia )
ო
select region in Tbilisi Kakheti Imereti ...
სი
ფ
do
break
ge
.
done
ელ
;;
ვე
u.
Spain )
select region in Madrid Barcelona Valencia ...
ო
ed
თ
do
შა
break
ე
u.
done
ერ
მუ
;;
bt
esac
მწ
სა
break
li@
done
მო
ის
echo
vi
echo " Perfect choice : $ country => $ region. Have a nice trip!"
ბი
არ
sh
echo
achiko@debian:∼$ ./script XYZ.sh
ნე
1) France
შვ
ba
2) Georgia
3) Spain
ნი
1) Tbilisi
e
2) Kakheti
il.
ვთ
3) Kartli
4) Imereti
ch
5) ...
ხო
Select City/Region/Province: 2
ar
გთ
245
16.6 არითმეტიკული გამოთვლები
:
ზე
Bash-ში ორმაგი ფრჩხილი აგრეთვე წარმოადგენს მთელი რიცხვების მანიპულირების
C-ის სტილის მექანიზმს. მაგალითად, ასეთი ჩანაწერი ((var++)) სავსებით სამართლიანია.
ა
ორმაგი ფრჩხილის კონსტრუქცია ჭეშმარიტია, თუ მასში ჩაწერილი არითმეტიკული გამოსახუ-
სტ
ლების მნიშვნელობა 0-სგან განსხვავებულია. შესაბამისად, მისი გამოსასვლელი კოდი 0 იქნე-
ბა. წინააღმდეგ შემთხვევაში კი მცდარი - გამოსასვლელი კოდი 0-სგან განსხვავბული იქნება.
ა!
დავრწმუნდეთ:
ო
სი
ფ
achiko@debian:∼$ ((8))
ge
achiko@debian:∼$ echo $?
.
ელ
0
achiko@debian:∼$ ((-1)); echo $? ვე
u.
0
ო
ed
თ
achiko@debian:∼$ ((0)); echo $? # 0-ზე გამოსახულება მცდარია!
1 # შესაბამისად, გამოსასვლელი კოდი 0-სგან განსხვავდება.
შა
u.
ერ
მუ
bt
ვიყენოთ: + მიმატება, - გამოკლება, * გამრავლება, / გაყოფა, ** ხარისხში აყვანა, % ნაშთიანი
მწ
სა
გაყოფა, = მინიჭება.
li@
მო
ის
achiko@debian:∼$ ((a=2**10))
vi
achiko@debian:∼$ echo $a
ბი
არ
sh
1024
ნე
ra
შვ
liz
8
e
2
achiko@debian:∼$ (( a=8 - 5)); echo $a
ch
3
ხო
ar
შემდეგი ფორმები:
ჩანაწერი მნიშვნელობა
246
var += value მიმატება. var ცვლადს ვანიჭებთ მის ძველ მნიშვნელობას დამატებული
value მნიშვნელობა. ექვივალენტია შემდეგი ჩანაწერის: var=var+value
var -= value გამოკლება. ექვივალენტია შემდეგი ჩანაწერის: var=var-value
:
var /= value გაყოფა. ექვივალენტია შემდეგი ჩანაწერის: var=var/value
ზე
var++ ინკრიმენტი4 . var ცვლადის პოსტ-ინკრიმენტი5 . ექვივალენტია შემდეგი ჩა-
ა
ნაწერის: var=var+1
სტ
var-- დეკრიმენტი6 . var ცვლადის პოსტ-დეკრიმენტი7 . ექვივალენტია შემდეგი
ჩანაწერის: var=var-1
ა!
ო
++var var ცვლადის პრე-ინკრიმენტი8 . ექვივალენტია შემდეგი ჩანაწერის:
სი
ფ
var=var+1
ge
var ცვლადის პრე-დეკრიმენტი9 . ექვივალენტია შემდეგი ჩანაწერის:
.
--var
ელ
var=var-1
ვე
u.
მოვიყვანოთ მაგალითი პოსტ/პრე-ინკრიმენტ/დეკრიმენტს შორის განსხვავების დასა-
ო
ed
თ
ფიქსირებლად.
შა
u.
ერ
#!/ bin/bash
მუ
bt
i=1
მწ
while :
სა
li@
do
მო
echo $((i++))
ის
sleep 1
vi
done
ბი
არ
1
ნე
2
ra
ეს
3
შვ
^C
ba
ნი
liz
#!/ bin/bash
შე
i=1
e
while :
il.
ვთ
do
echo $((++i))
ch
sleep 1
ხო
done
ar
გთ
4
ინკრიმენტი ნიშნავს ცვლადის მნიშვნელობის 1-ით გაზრდას.
5
პოსტ-ინკრიმენტი ნიშნავს ცვლადის მნიშვნელობის 1-ით გაზრდას მისი პირველად გამოყენების შემდეგ.
6
დეკრიმენტი ნიშნავს ცვლადის მნიშვნელობის 1-ით შემცირებას .
7
პოსტ-დეკრიმენტი ნიშნავს ცვლადის მნიშვნელობის 1-ით შემცირებას მისი პირველად გამოყენების შემდეგ.
8
პრე-ინკრიმენტი ნიშნავს ცვლადის მნიშვნელობის 1-ით გაზრდას მის გამოყენებამდე.
9
პრე-დეკრიმენტი ნიშნავს ცვლადის მნიშვნელობის 1-ით შემცირებას მის გამოყენებამდე.
247
achiko@debian:∼$ ./script XYZ.sh
2
3
4
^C
:
ზე
პირველ სკრიფტში ჯერ ვბეჭდავთ i ცვლადში არსებულ მნიშვნელობას - 1-ს, ხოლო
შემდეგ ვახდენთ მის ინკრიმენტს. მეორე სკრიფტში კი ჯერ ვახდენთ i ცვლადის ინკრიმენტს
ა
და შემდეგ ვბეჭდავთ ეკრანზე მის მნიშვნელობას.
სტ
ორმაგი ფრჩხილით რიცხვების შედარებაც უფრო მარტივად და კომპაქტურად ჩაიწე-
რება, ასე:
ა!
ო
სი
ფ
#!/ bin/bash
a=37
ge
if (($a >100))
.
ელ
then
x=10 ვე
u.
else
ო
ed
თ
x=20
fi
შა
u.
echo $x
ერ
exit 0
მუ
bt
achiko@debian:∼$ ./script XYZ.sh
მწ
სა
20
li@
მო
vi
sh
#!/ bin/bash
ნე
a=37
ra
ეს
if ((a >100))
შვ
then
ba
x=10
ნი
else
liz
x=20
შე
fi
e
echo $x
il.
ვთ
exit 0
ch
ar
expr1?expr2:expr3
248
თუ expr1 არითმეტიკული გამოსახულება ჭეშმარიტია, ანუ არ არის ნული, მაშინ შეს-
რულდეს expr2 გამოსახულება. წინააღმდეგ შემთხვევაში - expr3 გამოსახულება.
ჩვენი სკრიფტის ჩანაწერი ამ ოპერატორით შემდეგნაირად გამარტივდება:
:
20
ა ზე
ორმაგ ფრჩხილში შეიძლება შემდეგი ლოგიკური ოპერატორები გამოვიყენოთ:
სტ
ოპერ. მნიშვნელობა ნიმუში შედეგი
ა!
ო
> მეტია a=37; ((x = a>12?10:20)); echo $x 10
სი
ფ
>= მეტია ან ტოლი a=37; ((x = a=>12?10:20)); echo $x 10
ge
.
ნაკლებია
ელ
< a=37; ((x = a<12?10:20)); echo $x 20
ვე
u.
<= ნაკლებია ან ტოლი a=37; ((x = a<=12?10:20)); echo $x 20
ო
== უდრის a=37; ((x = a==37?10:20)); echo $x 10
ed
თ
შა
u.
ერ
&& ლოგიკური და a=37; ((x = a>20&&a<30?10:20)); echo $x 20
მუ
bt
|| ლოგიკური ან a=37; ((x = a>20||a<30?10:20)); echo $x 10
მწ
სა
li@
მო
ის
vi
sh
ra
ეს
achiko@debian:∼$ x = a>100?10:20
შვ
ეკრანზე შეცდომა მივიღეთ. ავხსნათ: შელის მიერ x ბრძანებად აღიქმება, რადგან მის
liz
achiko@debian:∼$ x=a>100?10:20
ch
achiko@debian:∼$
ხო
ar
249
achiko@debian:∼$ ls -l
-rw-r--r-- 1 achiko achiko 0 Jun 5 13:12 100?10:20
...
აღნიშნული ფაილი მართლაც შეიქმნა (ან არსებობდა და მის შიგთავსს ახალი ბრძანე-
ბის შედეგი გადავაწერეთ) და მისი ზომა არის ნული ბაიტი.
:
ზე
სამკომპონენტიანი ოპერატორის ჩაწერისას უნდა გავითვალისწინოთ, რომ მის გამო-
სახულებებში მინიჭების ოპერაციის (=) პირდაპირ გამოყენება არ შეიძლება. ის შეცდომით დას-
ა
რულდება bash-ში. ამის თავიდან ასაცილებლად, გამოსახულება ფრჩხილებში უნდა მოვათავ-
სტ
სოთ. მოდით, მაგალითი მოვიყვანოთ:
ა!
ო
achiko@debian:∼$ i=0
სი
ფ
achiko@debian:∼$ ((i<1?++i:–i)); echo $i
1
ge
achiko@debian:∼$ ((i<1?++i:–i)); echo $i
.
ელ
0
achiko@debian:∼$ ((i<1?++i:–i)); echo $i ვე
u.
1
ო
ed
თ
achiko@debian:∼$ ((i<1?++i:–i)); echo $i
0
შა
u.
ერ
მუ
bt
ახორციელებს და პირიქით. მოდით, ახლა აქ გამოყენებული ინკრიმენტისა და დეკრიმენტის
მწ
სა
achiko@debian:∼$ ((i<1?i+=1:i-=i))
vi
token is "-=1")
sh
ნე
ra
ba
იმუშავებს:
ნი
liz
1
e
0
ვთ
ch
base#number
250
ზოგადი ჩანაწერის გაკეთებაც შეიძლება. ვნახოთ ისინი:
ჩანაწერი მნიშვნელობა
:
0· x number ასეთი ჩანაწერი კი თექვსმეტობითი თვლის სისტემის რიცხვია.
ზე
number ჩვეულებრივად ჩაწერილი რიცხვი, ნაგულისხმევი მნიშვნელობით, ათობითი
ა
სისტემის რიცხვია.
სტ
base#number ეს ზოგადი აღნიშვნაა. ასე მოიცემა base თვლის სისტემის number რიცხვი.
ა!
ო
სი
ფ
ავიღოთ თვლის სხვადასხვა სისტემაში ერთი რიცხვი, მაგალითად 21 და ვნახოთ, რა
იქნება მისი შესაბამისი რიცხვი თვლის ათობით სისტემაში.
ge
.
ელ
achiko@debian:∼$ echo $((21)) # 2110 2110
ვე
u.
21
# 218 1710
ო
achiko@debian:∼$ echo $((021))
ed
თ
17
შა
u.
ერ
33
მუ
# 2111 2310
bt
achiko@debian:∼$ echo $((11#21))
მწ
23
სა
li@
achiko@debian:∼$ echo $((16#21)) # 2116 3310
მო
33
# 212 შეცდომა
ის
-bash: 2#21: value too great for base (error token is "2#21")
ბი
არ
sh
ბოლო ბრძანება სწორად არ არის ჩაწერილი, რადგან თვლის ორობით სისტემაში მხო-
ნე
ra
ლოდ ორი ცალი ციფრი გვაქვს: 0 და 1. ჩვენს მაგალითში კი შედის სხვა ციფრიც - 2 (რიცხვში
ეს
21).
შვ
ba
liz
496
e
il.
ვთ
მოყვანილ მაგალითებში ვნახეთ, რომ თვლის ნებისმიერ სისტემაში ჩაწერილი რიცხვი გამო-
ar
მოვიქცეთ, თუ გვსურს ერთი სისტემის რიცხვი, ათობითის გარდა სხვა სისტემაში ვნახოთ. ამ
დროს შეგვიძლია, გამოვიყენოთ ჩვენთვის უკვე კარგად ნაცნობი bc ბრძანება. ამ ბრძანებაში
სპეციალური ცვლადებით შეგვიძლია განვსაზღვროთ დასამუშავებელი რიცხვი რა სისტემაში
იგულისხმოს (ibase ცვლადით) და უკვე დამუშავებული რიცხვი თვლის რა სისტემაში გამოიტა-
10
სრულყოფილია რიცხვი, თუ ის ყველა საკუთარი გამყოფის ჯამის ტოლია.
251
ნოს (obase ცვლადით) შელმა. ნაგულისხმევი მნიშვნელობით, ეს ცვლადები ათობით სისტემას
წარმოადგენს. მაგალითი:
:
10010010110
ა ზე
16.6.1 ბიტური ოპერაციები
სტ
კომპიუტერები ინფორმაციას იმავე ხერხით ვერ აღიქვამენ, როგორითაც ადამიანები.
ა!
მაგალითად, მათ არ ესმით სიტყვები, ხმა. თუ ამ ინფორმაციას ისეთ სისტემაში გადავიყვანთ,
ო
რომელიც კომპიუტერისთვის გასაგები იქნება, ცხადია ისინიც გაიგებენ ამ ყველაფერს. რო-
სი
ფ
გორც უკვე ვიცით, ასეთი სისტემა ორობითი სისტემაა. თანამედროვე გამომთვლელ სისტემებში
ნებისმიერი ინფორმაცია წარმოდგენილია ელექტრული სიგნალით, რომელსაც ორი მდგომარე-
ge
.
ობა შეიძლება ჰქონდეს: ჩართული ან გამორთული. ეს კი კარგად შეესაბამება თვლის ორობით
ელ
სისტემას, რომელშიც მხოლოდ ორი ციფრი გვაქვს 1 და 0.
ვე
u.
თვლის ორობით სისტემაზე ოპერაციების ჩატარების ცოდნა მნიშვნელოვანია, რადგან
კომპიუტერში ინფორმაცია სწორედ ორობით სისტემაშია წარმოდგენილი. ასეთი ოპერაციები
ო
ed
თ
გამოიყენება ჩაშენებულ სისტემებში, დაბალი დონის დაპროგრამების ენებში, ვიდეო დეკო-
შა
u.
ჩატარება ჩვენთვის უჩვეულო ხერხია, მაგრამ კომპიუტერებისთვის ეს ბუნებრივი მეთოდია.
ერ
მუ
bt
შელში შესაძლებელია ორობით რიცხვებზე ოპერაციების ჩატარება. მოდით, ვნახოთ ისინი დე-
მწ
სა
ტალურად:
li@
მო
ის
ოპერატორი მნიშვნელობა
vi
sh
ba
252
<< მარცხნივ დაძვრა. ამ ოპერაციის დროს ოპერანდად ორი რიცხვი აიღება და
პირველი რიცხვის ორობით ვერსიაზე ხდება ბიტების მარცხნივ დაძვრა იმ-
დენი ბიტით, რამდენიც მეორე ოპერანდად არის მითითებული. უკიდურესი
მარცხენა ბიტები არ იკარგება, მხოლოდ დაიძვრება მარცხნივ და ცარიელი
ბიტები 0-ებით შეივსება. მოკლედ რომ ვთქვათ, ამ რიცხვის ორობით ჩანა-
წერს ბოლოში, მარცხნივ, იმდენივე 0 მიეწერება, რამდენიც მეორე ოპერან-
:
ზე
დად არის მოცემული.
ა
ბიტური ოპერაციები ორობით რიცხვებზე ხორციელდება. მართალია, შელში შეტანისას
სტ
ოპერანდებად აღებული რიცხვები ათობით რიცხვებს წარმოადგენს, თუმცა ისინი ოპერაციის
დროს თვლის ორობით სისტემაში კონვერტირდება და ოპერაციაც მათზე ხდება. მიღებული
ა!
ო
შედეგი კი კვლავ ათობით სისტემაში წარმოდგინდება და ისე მოგვეწოდება ჩვენ ეკრანზე.
მოდით, გავიხსენოთ ბიტური ოპერაციები:
სი
ფ
AND 0 1 OR 0 1 XOR 0 1
ge
.
ელ
0 0 0 0 0 1 0 0 1
ვე
u.
1 0 1 1 1 1 1 1 0
ო
ed
თ
შა
u.
მაგალითები:
ერ
მუ
bt
achiko@debian:∼$ echo $(( 11 & 12 ))
მწ
სა
li@
8
მო
ის
sh
# 1110 10112
ნე
1011
ეს
შვ
1100
ნი
liz
8
ხო
ar
ახლა უკვე გასაგებია შედეგი. ასეთივე ხერხით შეგიძლიათ შემდეგი ბრძანებების სის-
წორეში დარწმუნდეთ.
გთ
253
achiko@debian:∼$ echo $(( 11 ^ 12 ))
7
:
ზე
ავხსნათ, თუ რატომ მივიღეთ ბოლო მაგალითში უარყოფითი რიცხვი -127. როგორც
ა
უკვე ვახსენეთ, ნებისმიერი მონაცემი, მათ შორის რიცხვი, კომპიუტრში ორობითი ჩანაწერით
სტ
მოიცემა ანუ რიცხვი წარმოადგენს ბიტების (0 და 1) თანმიმდევრობას. ავიღოთ უარყოფითი
რიცხვი. მათემატიკაში უარყოფით რიცხვს წინ - ნიშანი უწერია. კომპიუტერებში კი ბიტების
”
ა!
ო
თანმიმდევრობას წინ ნიშანი არ აქვს. ასეთ დროს ნიშანის განსაზღვრა დამატებითი ბიტის შემო-
ტანით ხდება. არსებობს რამდენიმე მეთოდი ორობით სისტემაში უარყოფითი რიცხვების წარ-
სი
ფ
მოსადგენად. ერთ-ერთი მათგანია ორის დამატება (two's complement). სწორედ ამ მეთოდს
”
იყენებს ბაში ნიშნიანი რიცხვების წარმოსადგენად. ვნახოთ 8 ბიტიანი რიცხვის წარმოდგენა:
ge
.
ელ
ორობითი ორის დამატებით ვე
უნიშნო
u.
მნიშვნელობა წარმოდგენა წარმოდგენა
ო
ed
თ
00000000 0 0
შა
u.
00000001 1 1
ერ
მუ
.. .. ..
bt
. . .
მწ
სა
li@
01111110 126 126
მო
vi
sh
.. .. ..
შვ
. . .
ba
11111110 -2 254
ნი
liz
11111111 -1 255
შე
e
il.
დავრწმუნდეთ:
გთ
254
ჩვენს მაგალითში 263 -ს 1 იმიტომ გამოვაკელით, რომ რაოდენობის ათვლა 0-დან იწყე-
ბა და მაქსიმალური რიცხვი პირველი უარყოფით რიცხვზე გადადის (დიაპაზონის უმცირესი
რიცხვი). 1-ის გამოკლებით დიაპაზონის უდიდეს რიცხვს მივიღებთ.
ახლა, ბიტების მარჯვნივ და მარცხნივ დაძვრის მაგალითები ვნახოთ:
:
5
ზე
achiko@debian:∼$ echo $(( 11>>2 ))
2
ა
achiko@debian:∼$ echo $(( 11>>3 ))
სტ
1
achiko@debian:∼$ echo $(( 11>>4 ))
ა!
ო
0
სი
ფ
achiko@debian:∼$ echo $(( 11>>5 ))
0
ge
.
ელ
ვე
ავხსნათ, თუ რატომ მივიღეთ ასეთი შედეგი. მივყვეთ დეტალურად: 11-ის ორობითი
u.
მნიშვნელობაა 1011. მარჯვნივ 1 ბიტის წანაცვლებით მივიღებთ 0101-ს. მისი ათობითი მნიშ-
ვნელობა არის 5. მარჯვნივ 2 ბიტის წანაცვლებით მივიღებთ 0010-ს. მისი ათობითი მნიშვნელო-
ო
ed
თ
ბა არის 2. 3 ბიტის წანაცვლებით მივიღებთ 0001-ს, ათობითში - 1. 4 ბიტის წანაცვლებით (და
შა
ე
შემდეგ) მივიღებთ ყოველთვის 0000-ს, ათობითში 0-ს. გამოდის, მარჯვნივ დაძვრით რიცხვის
u.
ერ
მნიშვნელობა ნელ-ნელა კლებულობს და ბოლოს 0-ზე დადის. ამ ოპერაციების უკეთ გასაგებად
მუ
bt
მწ
სა
li@
1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1
მო
ის
0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
vi
ბი
არ
sh
ra
ეს
ba
ნი
22
შე
44
il.
88
ch
ხო
ბით მივიღებთ 10110-ს. მისი ათობითი მნიშვნელობა არის 22. მარცხნივ 2 ბიტის წანაცვლებით
გთ
მივიღებთ 101100-ს. მისი ათობითი მნიშვნელობა არის 44. 3 ბიტის წანაცვლებით მივიღებთ
1011000-ს, ათობითში - 88. გამოდის, მარცხნივ დაძვრით რიცხვის ორიბით მნიშვნელობას 0-ებს
ვუმატებთ ბოლოში და მნიშვნელობა ამით ორჯერ იზრდება. ამ ოპერაციების უკეთ გასაგებად
16.12 ცხრილი დაგვეხმარება:
რადგანაც მარცხნივ დაძვრა წინა რიცხვის ორმაგ მნიშვნელობას გვაძლებს, ამ ოპერა-
ციითაც შეგვიძლია, ვიპოვოთ Bash-ის არითმეტიკულ გამოთვლებში უდიდესი რიცხვი, ასე:
255
1 0 1 1 1 0 1 1 1 0 1 1
1 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 0 0
:
ა ზე
სტ
achiko@debian:∼$ echo $(( (1<<63) -1 ))
9223372036854775807
ა!
ო
იმის გამო, რომ Bash-ში გასაგები რიცხვების დიაპაზონი 64 ბიტით არის განსაზღვრუ-
სი
ფ
ლი, 64-ის ჯერადი ნებისმიერი რიცხვი გამოგვადგება უდიდესის საპოვნელად, ასე:
ge
.
ელ
achiko@debian:∼$ echo $(( (1<<127) -1 ))
ვე
u.
9223372036854775807
achiko@debian:∼$ echo $(( (1<<1023) -1 ))
ო
ed
თ
9223372036854775807
შა
u.
ერ
შეგვიძლია უდიდესი რიცხვის საძიებელ პროცესს დინამიკურად დავაკვირდეთ შემდეგი
მუ
სკრიფტის საშუალებით:
bt
მწ
სა
li@
#!/ bin/bash
მო
a=1
ის
do
ბი
არ
sleep 0.2
ნე
done
ra
ეს
exit 0
შვ
ba
4
liz
8
შე
16
e
32
il.
ვთ
64
128
ch
256
ხო
512
ar
1024
გთ
...
8388608
16777216
...
8796093022208
256
17592186044416
...
4611686018427387904
-9223372036854775808
:
ზე
რიცხვს 1 გამოვაკლოთ:
ა
achiko@debian:∼$ echo $(($(a=1;while((a>0));do((a<<=1));done;echo $a)-1))
სტ
9223372036854775807
ა!
ო
როგორც ბევრ მაგალითში ვნახეთ, ((expression)) კონსტრუქცია მოსახერხებელ მე-
სი
ფ
თოდს წარმოადგენს რიცხვებთან ურთიერთობისას. bash-ში გვაქვს ამ ჩანაწერის ზუსტი ექ-
ვივალენტური სხვა სტრუქტურაც. მისი სინტაქსი ასეთია: let expression. უკეთესი კითხვა-
ge
.
დობისთვის გამოსახულებას ბრჭყალებში სვამენ ხოლმე, ასე: let "expression", თუმცა ეს
ელ
ვე
აუცილებელი არ არის. let ბაშის შიდა ბრძანებას წარმოადგენს. ვნახოთ მისი გამოყენების
u.
რამდენიმე მაგალითი:
ო
ed
თ
achiko@debian:∼$ let a=11 # იგივეა, რაც a=11
შა
u.
ერ
achiko@debian:∼$ echo "11 + 5 = $a"
მუ
bt
11 + 5 = 16
მწ
li@
achiko@debian:∼$ echo $a
მო
128
ის
achiko@debian:∼$ echo $a
ბი
არ
32
sh
achiko@debian:∼$ echo $a
ra
ეს
33
შვ
achiko@debian:∼$ echo $x
ნი
11
liz
შე
ერთ-ერთ წინა მაგალითში, უდიდესი რიცხვის პოვნის პროცესმა გარკვეული დრო წაი-
e
ღო. ვნახოთ რამდენს ხანს გაგრძელდა ის და ზოგადად, როგორ შეგვიძლია გაშვებული სკრიფ-
il.
ვთ
დენი წამია გასული გამოძახების მომენტამდე. SECONDS-ში გაგრძელდება დროის ათვლა და მისი
ხო
#!/ bin/bash
a=1
while ((a >0))
do
257
$((a < <=1))
sleep 0.03
done
echo "უდიდესი რიცხვია: $(($a -1))"
echo "სკრიფტი გაგრძელდა $ SECONDS წამი"
exit 0
:
ზე
achiko@debian:∼$ ./script XYZ.sh
უდიდესი რიცხვია: 9223372036854775807
ა
სკრიფტი გაგრძელდა 2 წამი
სტ
ამ სკრიფტში ხელოვნურად გვაქვს დაყოვნება მოცემული, თორემ თანამედროვე პრო-
ა!
ო
ცესორები ამ ამოცანას წამიერად ითვლის.
სი
ფ
თუ დიდხანს გრძელდება პროცესი, მისი ხანგრძლივობის მოცემა წამებში კარგად აღ-
ge
ქმადი აღარ იქნება. ამიტომ, შეგვიძლია ეს დრო საათებში, წუთებსა და წამებში თავად გადა-
.
ელ
ვიყვანოთ. მაგალითისთვის, შევამოწმოთ, რა დრო გავიდა შელის გაშვებიდან, სადაც მუშაობას
ვაგრძელებთ. ვე
u.
ო
ed
თ
achiko@debian:∼$ echo $SECONDS
შა
26829
ე
u.
ერ
achiko@debian:∼$ t=$SECONDS
მუ
bt
7 სთ 27 წთ 34 წმ
მწ
სა
li@
მო
ასე დრო უფრო გასაგებად გამოიყურება. თუ დარწმუნებული ხართ, რომ SECONDS ერთ
ის
დღესაც კი არ ითვლის (86400 წამს), მაშინ date ბრძანებასაც შეუძლია მისაღები ფორმატით
vi
sh
ra
შვ
ba
როგორც პირველ ნაწილში განვიხილეთ, არსებობს ბრძანება time. ის უფრო ზუსტ და ტექნიკუ-
liz
მუშაობის დროს:
e
il.
ვთ
real 0m3.496s
ar
user 0m0.096s
sys 0m0.124s
გთ
vi-დან გამოსვლის შემდეგ ვიგებთ, რომ 3.496 წამი გასულა, რაც ამ რედაქტორში ვმუ-
შაობთ. ამასთან, დეტალური ინფორმაციაც გვაქვს იმის შესახებ, თუ რა დრო (CPU time) დახარ-
ჯა პროცესორმა ამ პროცესის შესრულებისთვის მომხმარებლის გარემოში და რა დრო დახარჯა
ბირთვის გარემოში (ანუ ბირთვმა რა დრო გამოიყენა ამ პროცესისთვის). time-ის გამოსას-
258
ვლელის ფორმატი შეგვიძლია დავაკონფიგურიროთ, სურვილისამებრ, TIMEFORMAT ცვლადის
საშუალებით, ასე:
:
real 0m2.067s user 0m0.052s sys 0m0.108s
ა ზე
time ბრძანება, სინამდვილეში, bash-ში არის ინტეგრირებული და მის სიტყვა-გასაღებს
სტ
წარმოადგენს. მის გარდა, არსებობს GNU-ს ვერსიის ბრძანებაც იმავე დასახელებით (განთავ-
სებულია /usr/bin/ დირექტორიაში). /usr/bin/time ბრძანებით უფრო მეტი ინფორმაციის
ა!
ო
მიღება შეიძლება გამოსასვლელზე. ამავდროულად, მისი კონფიგურირებაც შეგვიძლია -f ან
--format ოფციით, თან გაცილებით მრავალფეროვნად, ვიდერე სიტყვა-გასაღებს. აღსანიშნა-
სი
ფ
ვია, რომ GNU-ს ვერსიის time ბრძანება, ნაგულისხმევი მნიშვნელობით, სისტემაში არ არის
დაყენებული. ის ხელით უნდა დავაინსტალიროთ.
ge
.
ელ
ვე
u.
achiko@debian:∼$ type -a time
time is a shell keyword
ო
ed
თ
time is /usr/bin/time
შა
u.
0.10user 0.03system 0:03.17elapsed 4%CPU (0avgtext+0avgdata 7528maxresident)k
ერ
მუ
bt
achiko@debian:∼$ /usr/bin/time -f"რეალური დრო: %E" vi test.txt
მწ
სა
ყველა რიცხვს ჩამოწერს (ნაგულისხმევი მნიშვნელობით, 1-ის ბიჯით). ორი არგუმენტის შემ-
ba
გამოიტანს პირველი რიცხვიდან მესამე რიცხვის ჩათვლით, მეორე რიცხვის ბიჯით. ვნახოთ,
liz
achiko@debian:∼$ seq 5
il.
ვთ
1
2
ch
3
ხო
4
ar
5
გთ
achiko@debian:∼$ seq 5 10
5
6
7
8
259
9
10
achiko@debian:∼$ seq -w 5 10
05
06
07
:
08
ზე
09
10
ა
achiko@debian:∼$ seq -w -s " " 5 10
სტ
05 06 07 08 09 10
achiko@debian:∼$ seq -50 15 50
ა!
ო
-50
სი
ფ
-35
-20
ge
.
-5
ელ
10
ვე
u.
25
40
ო
ed
თ
achiko@debian:∼$ seq 0 0.02 1
შა
0.00
ე
u.
0.02
ერ
მუ
0.04
bt
...
მწ
0.98
სა
li@
1.00
მო
ის
sh
ნე
...
შვ
3.7
ba
3.8
ნი
3.9
liz
4
შე
4.1
e
4.2
il.
ვთ
4.3
4.4
ch
4.5
ხო
4.6
ar
4.7
გთ
4.8
4.9
5
260
მარტივ მამრავლებად ყოფს და ეკრანზე გამოაქვს.
:
ზე
16.6.3 შემთხვევითი რიცხვები
ა
სტ
შელში მუშაობისას აუცილებლად გექნებათ შემთხვევა, როდესაც შემთხვევითი მონაცე-
მის დაგენერირება დაგჭირდებათ - ეს იქნება შემთხვევითი რიცხვი, შემთხვევითი სიმბოლოების
ა!
ო
ერთობლიობა, შემთხვევითი ფაილის სახელი თუ შემთხვევითი პაროლი. რადგან ამ ნაწილში
რიცხვებზე ვმუშაობთ, ვახსენოთ, თუ როგორ შეგვიძლია შემთხვევითი რიცხვების შექმნა.
სი
ფ
ერთ-ერთი უმარტივესი გზა RANDOM ცვლადის გამოყენებაა. ის ყოველ ჯერზე, 0-დან
32767-ის ჩათვლით, სხვადასხვა რიცხვს მოგვცემს.
ge
.
ელ
ვე
u.
achiko@debian:∼$ echo $RANDOM
9240
ო
ed
თ
achiko@debian:∼$ echo $RANDOM
შა
30960
ე
u.
ერ
achiko@debian:∼$ echo $RANDOM
მუ
10671
bt
მწ
სა
li@
ამ ცვლადის გარდა, შელში არსებობს shuf ბრძანებაც, რომელიც მოცემული რიცხვების
მო
vi
ამორჩევა -n ოფციით.
ბი
არ
sh
196
ra
ეს
259
შვ
ba
177
273
ნი
236
liz
281
შე
283
e
246
il.
ვთ
259
...
ch
188
ar
122
გთ
290
achiko@debian:∼$ shuf -i 100-300 -n3
250
271
246
261
achiko@debian:∼$ shuf -i 100-300 -n1 # მხოლოდ ერთი შემთხვევითი რიცხვი
154
achiko@debian:∼$ shuf -i 100-300 -n1
234
achiko@debian:∼$ shuf -i 100-300 -n1
249
:
ზე
შემთხვევითობის ხარისხის გასაზრდელად შეგვიძლია /dev/urandom ან, უკეთესი შე-
ა
დეგისთვის, /dev/random ფაილის აღება და მისი შიგთავსის od ბრძანებით დამუშავება. ასე:
სტ
achiko@debian:∼$ od -An -N1 -i /dev/random
ა!
ო
49
სი
ფ
achiko@debian:∼$ od -An -N1 -i /dev/random
158
ge
.
ელ
ვე
-N1 ოფციით /dev/random ფაილიდან მხოლოდ 1 ბაიტის ტოლ მონაცემს ვიღებთ .
u.
შედეგად, მისი ათობით ფორმატში მოცემისას, შეგვეძლება მივიღოთ რიცხვი [0-256] ინტერ-
ვალში. უფრო დიდი რიცხვის მისაღებად, შეგვიძლია 2 ან 3 ბაიტი ამოვიღოთ დასამუშავებლად
ო
ed
თ
და მივიღებთ [0-65536] ან [0-16777216] ინტერვალიდან ერთ-ერთ რიცხვს.
შა
u.
ერ
achiko@debian:∼$ od -An -N2 -i /dev/random
მუ
bt
4198
მწ
li@
19241
მო
1719087
vi
10228736
sh
ნე
ra
ეს
შვ
ტივებს ამ მონაცემების დამუშავებას კოდის წერის დროს. ამასთან, ნებისმიერ დროს შეგვიძლია
შე
11
ტერმინები - არგუმენტი და პარამეტრი სკრიფტის წერისას ერთი და იმავე მნიშვნელობით იხმარება.
” ”
262
#!/ bin/bash
echo "პირველი არგუმენტია: $1"
echo "მეორე არგუმენტია: $2"
echo "მესამე არგუმენტია: $3"
achiko@debian:∼$ ./script XYZ.sh მიშკა ნინო იო
პირველი არგუმენტია: მიშკა
:
მეორე არგუმენტია: ნინო
ზე
მესამე არგუმენტია: იო
ა
სტ
შემდეგ გაშვებისას სკრიფტს თუ სხვა მონაცემებს გადაცვემთ, ცვლადის მნიშნველო-
ბები შეიცვლება. თუ გადაცემული არგუმენტები საკმარისი არაა, მაშინ ზედმეტი ცვლადები
ა!
”
ო
ცარიელი იქნება.
სი
ფ
achiko@debian:∼$ ./script XYZ.sh ფიზიკა ქიმია
ge
.
პირველი არგუმენტია: ფიზიკა
ელ
მეორე არგუმენტია: ქიმია
ვე
u.
მესამე არგუმენტია:
achiko@debian:∼$ ./script XYZ.sh ფიზიკა ქიმია მათემატიკა ბიოლოგია
ო
ed
თ
პირველი არგუმენტია: ფიზიკა
შა
u.
ერ
მესამე არგუმენტია: მათემატიკა
მუ
bt
მწ
li@
მო
vi
ba
263
$ წინა გაშვებული ბრძანების ბოლო არგუმენტი. იხილეთ მაგალითი 16.4
:
ზე
E_ BADARGS =85
ა
if [ ! -n "$1" ]
სტ
then
echo "გამოყენის წესი: `basename $0` არგ1 არგ2 და ა.შ."
ა!
ო
exit $E_ BADARGS
fi
სი
ფ
echo
ge
.
ელ
index =1 # ათვლის დაწყება
ვე
u.
echo "არგუმენტების გამოტანა \"\$*\"-ს საშუალებით:"
ო
ed
for arg in "$*" # არ იმუშავებს კარაგად ბრჭალების გარეშე
თ
do
შა
u.
ერ
let " index +=1"
მუ
bt
done # "$*" ყველა არგუმენს ერთ სიტყვად ხედავს
მწ
სა
li@
echo -e "\tარგუმენტთა სრული სია აღიქმება როგორც ერთი სიტყვა."
მო
ის
echo
vi
ბი
არ
ra
ეს
do
ნი
echo
ხო
ar
264
let " index +=1"
done # $* თითოეულ არგუმენტს ცალკეულ სიტყვებად ხედავს.
echo
:
ზე
index =1 # ათვლის თავიდან დაწყება.
ა
სტ
echo "არგუმენტების გამოტანა \$@-ს საშუალებით (ბრჭალების გარეშე):"
for arg in $@
ა!
do
ო
echo -e "\tArg #$ index = $arg"
სი
ფ
let " index +=1"
done # $@ თითოეულ არგუმენტს ცალკეულ სიტყვებად ხედავს.
ge
.
ელ
ვე
echo -e "\tარგუმენტები აღიქმება როგორც ცალკეული სიტყვები."
u.
exit 0
ო
ed
თ
achiko@debian:∼$ ./script XYZ.sh
შა
u.
ერ
achiko@debian:∼$ echo $?
მუ
85
bt
achiko@debian:∼$ ./script XYZ.sh მიშკა ნინო იო
მწ
სა
li@
არგუმენტების გამოტანა "$*"-ს საშუალებით:
მო
vi
sh
Arg #1 = მიშკა
ra
ეს
Arg #2 = ნინო
შვ
Arg #3 = იო
ba
liz
Arg #1 = მიშკა
e
Arg #2 = ნინო
il.
Arg #3 = იო
ვთ
Arg #1 = მიშკა
Arg #2 = ნინო
გთ
Arg #3 = იო
არგუმენტები აღიქმება როგორც ცალკეული სიტყვები.
achiko@debian:∼$ ./script XYZ.sh მიშკა "ნინო იო"
265
არგუმენტების გამოტანა "$*"-ს საშუალებით:
Arg #1 = მიშკა ნინო იო
არგუმენტთა სრული სია აღიქმება როგორც ერთი სიტყვა.
:
Arg #2 = ნინო იო
ზე
არგუმენტები აღიქმება როგორც ცალკეული სიტყვები.
ა
სტ
არგუმენტების გამოტანა $*-ს საშუალებით (ბრჭყალების გარეშე):
Arg #1 = მიშკა
Arg #2 = ნინო
ა!
ო
Arg #3 = იო
სი
ფ
არგუმენტები აღიქმება როგორც ცალკეული სიტყვები.
ge
.
არგუმენტების გამოტანა $@-ს საშუალებით (ბრჭყალების გარეშე):
ელ
Arg #1 = მიშკა
ვე
u.
Arg #2 = ნინო
Arg #3 = იო
ო
ed
თ
არგუმენტები აღიქმება როგორც ცალკეული სიტყვები.
შა
u.
ერ
შეგვიძლია ვთქვათ, რომ $@ და $* ჩანაწერები იდენტურია, ხოლო "$@" და "$*" კი გან-
მუ
bt
სხვავდება, ამასთან "$@"-ის ქცევა დამოკიდებულია, იმაზეც, თუ როგორი ფორმით გადავცემთ
მწ
არგუმენტებს.
სა
li@
მო
ის
vi
ისე, რომ მე-2 პარამეტრის მნიშვნელობა პირველ პარამეტრში ჩაიწეროს, მე-3 მე-2-ში, მე-4
ნე
ba
#!/ bin/bash
ნი
liz
შე
shift
il.
ვთ
shift
ხო
1
2
3
266
#!/ bin/bash
while (( $# ))
do
echo -n "არგუმენტების რაოდენობა: $# - "
echo "$@"
:
shift
ზე
done
ა
achiko@debian:∼$ ./script XYZ.sh 1 2 3 4 5
სტ
არგუმენტების რაოდენობა: 5 - 1 2 3 4 5
არგუმენტების რაოდენობა: 4 - 2 3 4 5
ა!
არგუმენტების რაოდენობა: 3 - 3 4 5
ო
არგუმენტების რაოდენობა: 2 - 4 5
სი
ფ
არგუმენტების რაოდენობა: 1 - 5
ge
.
ელ
შესაძლებელია, shift ბრძანებას არგუმენტად რიცხვი გადავცეთ, ასე: shift N და, ამ
შემთხვევაში, ის 1-ის ნაცვლად N ბიჯით დაძრავს არგუმენტებს.
ვე
u.
ო
ed
თ
მაგალითი 16.2: სკრიფტის PID, $$
შა
#!/ bin/bash
ე
u.
ერ
მუ
bt
echo " ეს ხაზი გამოჩნდება"
მწ
kill $$
სა
li@
echo " ეს ხაზი აღარ გამოჩნდება"
მო
ეს ხაზი გამოჩნდება
ბი
არ
Terminated
sh
achiko@debian:∼$
ნე
ra
ეს
შვ
ba
#!/ bin/bash
liz
შე
xlogo &
e
gedit &
il.
ch
echo "$!"
ხო
14551
გთ
267
14551 pts/1 00:00:00 xclock
14558 pts/1 00:00:00 ps
:
#!/ bin/bash
ზე
echo $_ # ./script XYZ.sh, გააჩნია რა ფორმით უშვებთ სკრიფტს
ა
სტ
du >/dev/null # ბრძანების სტ. გამოსასვლელს ეკრანზე არ ვუშვებთ
echo $_ # du
ა!
ო
ls -al >/dev/null # ბრძანების სტ. გამოსასვლელს ეკრანზე არ ვუშვებთ
სი
ფ
echo $_ # -al (ბოლო არგუმენტი)
ge
.
ელ
mkdir -p dira/dirb/dirc
echo $_ # dira/dirb/dirc (ბოლო არგუმენტი)
ვე
u.
ო
ed
:
თ
echo $_ # :
შა
u.
achiko@debian:∼$ ./script XYZ.sh
ერ
მუ
./script_XYZ.sh
bt
du
მწ
-al
სა
li@
dira/dirb/dirc
მო
:
ის
vi
ბი
არ
16.8 ფუნქციები
sh
ნე
”
ეს
გარდა ამისა, ფუნქცია კოდს უფრო ადვილად წაკითხვადს ხდის და საშუალებას იძლევა, რომ
ნი
function name {
il.
ვთ
command1 ;
ch
command2 ;
...
ხო
}
ar
გთ
ან
name () {
command1 ;
268
command2 ;
...
}
:
ზე
achiko@debian:∼$ func () { echo "ეს არის ფუნქცია"; echo;}
ა
სტ
მისი გამოძახება კი უბრალოდ სახელის ჩაწერით ხდება:
ა!
ო
achiko@debian:∼$ func
სი
ფ
ეს არის ფუნქცია
ge
.
ელ
ვე
შესაძლებელია, ერთი ფუნქციიდან მეორე ფუნქცია გამოიძახოთ. ასევე, შესაძლებელია
u.
რეკურსიული12 ფუნქციის (ფუნქციის თავის თავში გამოძახება) შექმნა.
ო
ed
თ
დაიმახსოვრეთ!
შა
u.
ერ
მუ
bt
2) ფუნქცია არ შეიძლება იყოს ცარიელი!
მწ
სა
li@
მო
ის
vi
achiko@debian:∼$ test ()
ბი
არ
> {
sh
> }
ნე
შვ
achiko@debian:∼$ test () { }
ba
liz
შე
achiko@debian:∼$ func ()
ch
> {
ხო
> }
achiko@debian:∼$ func
გთ
პირველი ვერსია
achiko@debian:∼$ func () { echo "მეორე ვერსია"; echo;}
12
რეკურსია არის ამოცანის გადაწყვეტის მეთოდი, როდესაც ამონახსენი დამოკიდებულია იმავე ამოცანის წინა წევ-
რებისთვის მიღებულ შედეგზე. კომპიუტერულ მეცნიერებებში რეკურსია ერთ-ერთ მთავარ პარადიგმას წარმოადგენს.
269
achiko@debian:∼$ func
მეორე ვერსია
:
achiko@debian:∼$ unset -f func
ზე
achiko@debian:∼$ func
-bash: func: command not found
ა
სტ
ფუნქციის გაშვებისას შესაძლებელია, მას არგუმენტები გადავცეთ. ამ შემთხვევაში,
ა!
ფუნქცია მათ აღიქვამს როგორც, ჩვეთნთვის უკვე კარგად ცნობილ, პოზიციურ პარამეტრებს
ო
და ისინი ფუნქციაში იმავენაირად წარმოდგინდება, როგორც სკრიფტში - $1, $2 და ა.შ. ცვლა-
სი
ფ
დებით.
ge
.
ელ
achiko@debian:∼$ func ()
> { ვე
u.
> echo "პირველი არგუმენტი: $1"
ო
ed
თ
> echo "მეორე არგუმენტი: $2"
> echo "მესამე არგუმენტი: $3"
შა
u.
> }
ერ
achiko@debian:∼$ func მიშკა ნინო იო
მუ
bt
პირველი არგუმენტი: მიშკა
მწ
li@
მესამე არგუმენტი: იო
მო
ის
vi
sh
ra
ეს
#!/ bin/bash
შვ
ba
func () {
ნი
}
il.
ვთ
echo
ar
270
ფუნქციის მეორე არგუმენტი: ორი
ფუნქციის მესამე არგუმენტი: სამი
:
ზე
როგორ გავნსაზღვროთ ფუნქციის გამოსასვლელი კოდი? აქ ჩვენთვის ნაცნობი exit
ა
N ბრძანება აღარ გამოგვადგება, რადგან ის, არა მხოლოდ ფუნქციიდან, არამედ მთლიანად
სტ
სკრიფტიდან გამოგვიყვანს. მხოლოდ ფუნქციის დასრულება return N ბრძანებით ხორციელ-
დება. ვნახოთ:
ა!
ო
სი
ფ
#!/ bin/bash
ge
.
func () {
ელ
echo "ფუნქციის პირველი არგუმენტი: $1"
ვე
u.
echo "ფუნქციის მეორე არგუმენტი: $2"
echo "ფუნქციის მესამე არგუმენტი: $3"
ო
ed
თ
exit 12
შა
}
ე
u.
ერ
მუ
bt
echo $?
მწ
სა
li@
echo
მო
sh
ra
შვ
achiko@debian:∼$ echo $?
ნი
12
liz
შე
#!/ bin/bash
ch
func () {
ხო
271
func ერთი ორი სამი
echo $?
echo
echo "სკრიფტის პირველი არგუმენტი: $1"
echo "სკრიფტის მეორე არგუმენტი: $2"
:
echo "სკრიფტის მესამე არგუმენტი: $3"
ზე
achiko@debian:∼$ ./script XYZ.sh one two three
ა
ფუნქციის პირველი არგუმენტი: ერთი
სტ
ფუნქციის მეორე არგუმენტი: ორი
ფუნქციის მესამე არგუმენტი: სამი
ა!
ო
12
სი
ფ
სკრიფტის პირველი არგუმენტი: one
სკრიფტის მეორე არგუმენტი: two
ge
.
სკრიფტის მესამე არგუმენტი: three
ელ
achiko@debian:∼$ echo $?
ვე
u.
0
ო
ed
თ
რეკურსიული ფუნქციის მაგალითი მოვიყვანოთ. სკრიფტს არგუმენტად რიცხვი გადავ-
შა
ე
ცეთ და ეკრანზე ამდენივე ფიბონაჩის13 რიცხვი გამოვიტანოთ (ფიბონაჩის მიმდევრობაში წევ-
u.
ერ
რის მნიშვნელობა მისი წინა 2 წევრის მნიშვნელობების ჯამის ტოლია):
მუ
bt
მწ
სა
#!/ bin/bash
li@
მო
if [ ! -n "$1" ]
ის
then
vi
sh
გამოტანა)"
exit 85
ნე
ra
fi
ეს
შვ
ba
fibonacci () {
index =$1
ნი
if (( $index == 0 ))
liz
then
შე
elif (( $index == 1 ))
il.
ვთ
then
ch
else
((-- index )); x=$( fibonacci $index )
ar
გთ
13
ფიბონაჩის რიცხვები მჭიდრო კავშირშია ბუნებასთან. ამ რიცხვებს ვხვდებით ხეების დატოტვისას, ტოტებზე ფოთ-
ლების მოწყობის დროს, მზესუმზირაში მარცვლების განლაგებისას, ნიჟარაზე სპირალის აგებულებისას და ა.შ. საოცა-
რია, მაგრამ ფიბონაჩის ერთი წევრის მის წინაზე გაყოფით (ზღვარში) ვიღებთ ოქროს კვეთის მნიშვნელობას. ოქროს
პროპორცია, ოქროს შუალედი კი არის ჰარმონიული გაყოფა მთელისა ისეთ ორ არატოლ ნაწილად, როდესაც მცირე
ნაწილი ისე შეეფარდება დიდს, როგორც დიდი მთელს ( ≈ 1,61803... ).
272
((-- index )); y=$( fibonacci $index )
echo -n "$((x+y)) "
fi
}
:
do
ზე
fibonacci $i
ა
done; echo
სტ
achiko@debian:∼$ ./script XYZ.sh 17
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
ა!
ო
თუ კარგად დააკვირდებით, შენიშავთ, რომ სკრიფტის შესრულებამ გარკვეული დრო
სი
ფ
წაიღო. რეკურსია მეტ-ნაკლებად ანელებს სკრიფტის პროცესს. ის ხომ თავის თავს იძახებს
ge
შესრულების პროცესში. შეგვიძლია სკრიფტის გაშვების პარალელურად, სხვა ტერმინალიდან
.
ელ
პროცესების სიას დავაკვირდეთ და დავრწმუნდეთ, რომ ის რამდენჯერმე იქნება გამოძახებუ-
ვე
ლი დროის კონკრეტულ მომენტში. ამაში watch ბრძანება დაგვეხმარება, რომლიც მოცემული
u.
ბრძანების გამოსასვლელს გარკვეული პერიოდულობით განაახლებს ეკრანზე:
ო
ed
თ
შა
u.
Every 0.3s: pstree -A my
ერ
მუ
bt
...
მწ
სა
|-login---bash---script_XYZ.sh---script_XYZ.sh---script_XYZ.sh ...
li@
...
მო
ის
vi
sh
მას.
ra
ეს
შვ
...
ნი
...
გთ
273
#!/ bin/bash
f (){(($1 <2))&& echo $1|| echo $[$(f $[$1 -1])+$( f $[$1 -2])];}
:
ზე
for i in `seq 0 $1 `; do f $i; done
ა
achiko@debian:∼$ ./script XYZ.sh 9
სტ
0
1
ა!
1
ო
2
სი
ფ
3
5
ge
.
8
ელ
13
ვე
u.
21
34
ო
ed
თ
შა
ე
შენიშნეთ, ალბათ, რომ პირველი ხაზი ფრჩხილებშია მოქცეული. ახლა მოაშორეთ ისი-
u.
ერ
ნი და თავიდან სცადეთ. რა შედეგს მიიღებთ? ამ საკითხს მოგვიანებით დავუბრუნდებით.
მუ
bt
ამჯერად, რეკურსიის გარეშე დავწეროთ ეს პროგრამა. ამგვარად, სკრიფტი გაცილებით
მწ
სა
#!/ bin/bash
vi
ბი
არ
n=$1
sh
while ((i<n))
შვ
do
ba
i=$((i+1)); c=$((a+b))
ნი
echo $c
liz
a=$b; b=$c
შე
done
e
0
1
ch
1
ხო
2
ar
3
გთ
5
8
...
987
1597
274
2584
...
6557470319842
10610209857723
17167680177565
...
:
420196140727489673
ზე
679891637638612258
1100087778366101931
ა
1779979416004714189
სტ
ა!
წინა სკრიფტებში რეკურსიულობა ფუნქციაში ფუნქციის გამოძახებით შევქმენით. თუმ-
ო
ცა, შეგვიძლია ფუნქციას თავი ავარიდოთ და, მის ნაცვლად, თავად სკრიფტი გამოვიძახოთ
სი
ფ
სკრიფტში. მაგალითის სანახავად წარმოვიდგინოთ შემდეგი სცენარი: ჩამოვიაროთ ყველა ფა-
ილი (ქვედირექტორიების ჩათვლით) და ეკრანზე მხოლოდ ჩვეულებრივი ტიპის ფაილი გამო-
ge
.
ვიტანოთ. ამ ამოცანის გადასაჭრელად ასე შეგვიძლია მოვიქცეთ - მიმდინარე დირექტორიიდან
ელ
ვე
სკრიფტს მხოლოდ ჩვეულებრივი ტიპის ფაილი გამოვატანინოთ, ხოლო თუ დირექტორია შეგ-
u.
ვხვდებათ, მაშინ საკმარისია, მასში გადავიდეთ და ჩვენი სკრიფტი იქ გავუშვათ. შემდეგ იქიდან
გამოვიდეთ, რათა სხვა დირექტორიებში ჩამოვლა არ გამოგვრჩეს. მოდით, განვახორციელოთ
ო
ed
თ
ეს იდეა.
შა
u.
ერ
#!/ bin/bash
მუ
bt
მწ
for i in *
სა
li@
do
მო
if [ -d "$i" ]
vi
then
ბი
არ
cd "$i"
sh
cd ..
ra
ეს
fi
შვ
done
ba
cities.txt
liz
countries.txt
შე
GPL-3
e
script_XYZ.sh
il.
ვთ
Tux.jpg
...
ch
ხო
ar
275
იწყება, შეგვიძლია, ის ჩვენთვის წინასწარ განსაზღვრულ ოფციად მივიჩნიოთ და შესაბამისი
ქმედებები მოვაყოლოთ. ამ კოდის დაწერა რთული არ არის, თუმცა შელში უკვე არსებობს ასე-
თი საშუალება. ამიტომ, სჯობს თავი ავარიდოთ ველოსიპედის ხელახლა გამოგონებას . ბრძა-
”
ნება getopts-ს შეუძლია გაანალიზოს სკრიფტის მთლიანი ხაზი და გადაარჩიოს გადაცემული
ოფციები და მისი არგუმენტები. ის იყენებს ორ ცვლადს: OPTARG-ს (OPTion ARGument), რო-
მელშიც ინახება ოფციაზე გადაცემული არგუმენტი თუ ასეთი არსებობს და OPTIND-ს (OPTion
INDex), რომელიც არგუმენტის მიმთითებელს წარმოადგენს. ის წარმოადგენს რიცხვს - შემდე-
:
ზე
გი დასამუშავებელი არგუმენტის ინდექსს (ინდექსის ნომერი იწყება 1-ით). getopts ბრძანებას,
როგორც წესი, while ციკლში წერენ ასე: while getopts "ab:cd:e".... ასეთი ჩანაწერი ნიშ-
ა
ნავს, რომ სკრიფტს შეიძლება გადავცეთ შემდეგი ოფციები: a, b, c, d ან/და e. ორწერტილი
სტ
იმაზე მიუთითებს, რომ მის წინ მდგომ ოფციას არგუმენტი უნდა გადავცეთ, რომელიც OPTARG
ცვლადში ჩაიწერება (ჩვენს შემთხვევაში ასეთებია b და d ოფცია). მოვიყვანოთ მარტივი მაგა-
ა!
ო
ლითი:
სი
ფ
#!/ bin/bash
ge
.
ელ
while getopts "ab:cde:" Option
ვე
u.
do
case $ Option in
ო
ed
თ
a|c) echo "გადაცემულია $ Option ოფცია";;
b) echo "გადაცემულია $ Option ოფცია. მისი არგუმენტია $ OPTARG ";;
შა
u.
d) echo "გადაცემულია $ Option ოფცია";;
ერ
მუ
bt
esac
მწ
done
სა
li@
achiko@debian:∼$ ./script XYZ.sh -a
მო
გადაცემულია a ოფცია
ის
გადაცემულია a ოფცია
ბი
არ
sh
გადაცემულია c ოფცია
achiko@debian:∼$ ./script XYZ.sh -ac
ნე
ra
გადაცემულია a ოფცია
ეს
გადაცემულია c ოფცია
შვ
ba
liz
გადაცემულია c ოფცია
შე
გადაცემულია a ოფცია
il.
ვთ
გადაცემულია c ოფცია
ch
გადაცემულია a ოფცია
გადაცემულია c ოფცია
გთ
276
გადაცემულია d ოფცია
გადაცემულია b ოფცია. მისი არგუმენტია TEST1
გადაცემულია e ოფცია. მისი არგუმენტია TEST2
:
ზე
საკმარისია getopts-ს ოფციების სია ორწერტილით დავიწყოთ. ამ ქმედებით ჩავრთავთ ე.წ.
შეცდომების ჩუმი გამოტანის რეჟიმს (silent error reporting). ამ დროს არასწორად გადაცემუ-
ა
ლი ოფცია უგულებელყოფილი იქნება.
სტ
#!/ bin/bash
ა!
ო
სი
ფ
while getopts ":ab:cd:e" Option
do
ge
.
case $ Option in
ელ
a|c|e) echo "გადაცემულია $ Option ოფცია";;
ვე
u.
b|d) echo "გადაცემულია $ Option ოფცია არგუმენტით $ OPTARG ";;
esac
ო
ed
თ
done
შა
u.
ერ
გადაცემულია a ოფცია
მუ
გადაცემულია c ოფცია
bt
achiko@debian:∼$ ./script XYZ.sh -acbTEST1
მწ
სა
გადაცემულია a ოფცია
li@
გადაცემულია c ოფცია
მო
vi
ბი
არ
ვნახოთ, რას ნიშნავს OPTIND ცვლადი. ის არის არა მიმდინარე, არამედ მომდევნო
sh
ra
ეს
#!/ bin/bash
შვ
ba
liz
do
შე
a 2
ch
b 3
ხო
c 5 TEST
ar
გთ
277
დავრწმუნდეთ:
:
ზე
achiko@debian:∼$ ./script XYZ.sh -ab -c TEST
ა
სტ
a 1
b 2
ა!
c 4 TEST
ო
სი
ფ
ბოლო მაგალითში პირველი არგუმენტია ab, მეორე c, მესამე კი TEST. a ოფციის შემდეგ
გამოძახებული ოფციის (ანუ b ოფციის) არგუმენტი კვლავ 1 არის. ამიტომ გამოვიდა a-სთვის
ge
.
1. b ოფციის შემდეგ გამოძახებული ოფციის არგუმენტი უკვე არის 2, ხოლო c-სთვის კი იქნება
ელ
ვე
4, იმიტომ, რომ TEST c ოფციის შემადგენელი ნაწილია და ეს ორი პარამეტრი მთლიანობაში
u.
აღიქმება. რადგან TEST მესამე არგუმენტია, მისი მომდევნო ნომერი 4 გამოდის.
ვნახოთ სხვადასხვა ვარიაციაც:
ო
ed
თ
შა
u.
achiko@debian:∼$ ./script XYZ.sh -abc TEST
ერ
მუ
a 1
bt
b 1
მწ
c 3 TEST
სა
li@
achiko@debian:∼$ ./script XYZ.sh -abcTEST
მო
a 1
ის
b 1
vi
c 2 TEST
ბი
არ
sh
ra
შვ
#!/ bin/bash
ch
NO_ARGS =0
ხო
E_ OPTERROR =85
ar
გთ
278
while getopts ":ab:cd:e" Option
do
case $ Option in
a|c|e) echo "გადაცემულია $ Option ოფცია";;
b|d) echo "გადაცემულია $ Option ოფცია არგუმენტით $ OPTARG ";;
:
esac
ზე
done
ა
სტ
shift $(($ OPTIND - 1))
ა!
echo; echo "ოფციების გარდა სკრიფტზე გადაცემული $# არგუმენტი. ესენია:"
ო
for i in $@
სი
ფ
do
echo "$i"
ge
.
done
ელ
exit $?
ვე
u.
achiko@debian:∼$ ./script XYZ.sh -a -c -d TEXT arg1 arg2 arg3
გადაცემულია a ოფცია
ო
ed
თ
გადაცემულია c ოფცია
შა
u.
ერ
მუ
bt
arg1
მწ
სა
arg2
li@
arg3
მო
ის
vi
sh
ნე
#!/ bin/bash
ra
ეს
შვ
NO_ARGS =0
ba
E_ OPTERROR =85
ნი
liz
then
e
fi
ch
ხო
do
case $ Option in
გთ
279
#shift $(($ OPTIND - 1))
:
echo "$i"
ზე
done
ა
exit $?
სტ
achiko@debian:∼$ ./script XYZ.sh -a -c -d TEXT arg1 arg2 arg3
გადაცემულია a ოფცია
ა!
ო
გადაცემულია c ოფცია
გადაცემულია d ოფცია არგუმენტით TEXT
სი
ფ
ოფციების გარდა სკრიფტზე გადაცემული 7 არგუმენტი. ესენია:
ge
.
-a
ელ
-c
ვე
u.
-d
TEXT
ო
ed
თ
arg1
შა
arg2
ე
u.
ერ
arg3
მუ
bt
მწ
li@
ბრძანების მიერ ოფციებისთვის აღქმული არგუმენტების რაოდენობით.
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
280
თავი 17
:
ა ზე
ტერმინალები
სტ
ა!
ო
სი
ფ
ერმინალზე მუშაობისას გაშვებული ბრძანებების შედეგი ეკრანზე შავ-თეთრი ფერებით
ge
.
ელ
გაგახსენდებათ ბევრი შემთხვევა, როდესაც შელის მოსაწვევში ან სკრიფტების წერის
ვე
დროს ტერმინალზე მონაცემები სხვადასხვა ფერში გამოისახება. მაგალითად, vi-სა თუ
u.
emacs ტექსტურ რედაქტორში კოდის გარკვეული ფრანგმენტები. გამოდის, რომ ტერმინალს ფე-
ო
ed
რების აღქმა შეუძლია. მაშ, როგორ შეგვიძლია, სხვადასხვა ფერით თავად დავბეჭდოთ ტექსტი
თ
ტერმინალში? სანამ ამ საკითხს დეტალურად განვიხილავთ, გავისხენოთ თუ რა არის ტერმი-
შა
ნალი.
ე
u.
ერ
მუ
bt
17.1 ტერმინალის საკონტროლო კოდები
მწ
სა
li@
ისტორიულად, ტერმინალი წარმოადგენდა ფიზიკურ მოწყობილობას, რომელიც გადას-
მო
vi
sh
ქმედების შესრულება. ეს ქმედება შეიძლება იყოს კურსორის გადატანა ეკრანის ერთი პოზი-
e
Text terminals. სწორედ ტექსტურ ტერმილაში გადაიცემა მონაცემი ბაიტ-ბაიტ. ისინი შემ-
დეგი სახელწოდებებითაც გვხვდება: General purpose terminal, General display terminal,
გთ
Serial monitor, Serial console, Serial terminal, Character-cell terminal, Character terminal,
1
ის ერთ-ერთი ყველაზე პრიმიტიული, ნელი ტერმინალი იყო. dumb terminal-ს მხოლოდ პროცესორისგან მიღებუ-
ლი მონაცემებს გამოტანა შეეძლო ეკრანზე
2
გრაფიკულ ტერმინალს ტექსტის გარდა შეუძლია სურათის გამოტანაც. არსებობს როგორც ვექტორული, ასევე
რასტრულ რეჟიმში მომუშავე ტერმინალები.
281
ASCII/ANSI terminal, Asynchronous terminal, Data terminal, Video terminal, Video display
terminal (VDT), Green terminal (მას შემდეგ, რაც მწვანე დისპლეის გამოყენება დაიწყეს). არ-
სებობენ ისეთი Text terminal-ებიც, რომლებიც მონაცემებს არა ბაიტ-ბაიტ, არამედ ბლოკურად
გადასცემენ. აქ შეყვანილი ასო-ნიშნების გარკვეული რაოდენობა დროებით ინახება ტერმინა-
ლის მეხსიერებაში და შემდეგ ერთბაშად, ბლოკურად, გადაეცემა კომპიუტერს. ასეთ რეჟიმში
მომუშავე ტერმინალები არ არიან მხარდაჭერილნი ლინუქსში.
თავდაპირველად, ტერმინალების მწარმოებელი თითქმის ყველა კომპანია საკუთარ
:
ზე
ტერმინალზე მორგებულ საკონტროლო სიმბოლოებს ქმნიდა. დროთა განმავლობაში მათი რი-
ცხვი გაიზარდა. DEC კომპანიამ შექმნა შემდეგი ცნობილი ვიდეო ტერმინალები - VT100, VT101
ა
და ა.შ. IBM-მა - IBM 2250, IBM 2260 და სხვა. მრავალ ტერმინალებს შორის თავსებადობის
სტ
შესანარჩუნებლად ზოგიერთი ტერმინალი თუ ტერმინალის ემულატორები ფართოდ გავრცე-
ლებულ, უკვე შემქნილ კოდებს იყენებდნენ. საყოველთაოდ გავრცელებული ერთ-ერთი ასე-
ა!
თი სპეციალური სიმბოლოების ნაკრებია ANSI3 Control sequences. მიუხედავად იმისა, რომ
ო
Unix-ის მსგავსი სისტემებისთვის შექმნეს ბიბლიოთეკების ნაკრები termcap, შემდეგ terminfo
სი
ფ
(termcap-ის გაუმჯობესებული ვარიანტი), რომლებიც შეიცავენ სხვადასხვა ტერმინალის შესაძ-
ლებლობების მონაცემთა ბაზას, ამ სისტემებში მაინც ყოველთვის იყო ინტეგრირებული ANSI
ge
.
Control sequences-ის მხარდაჭერა. სწორედ ამან გამოიწვია ANSI სპეციალური სიმბოლოების
ელ
ვე
ფარდოდ გამოყენება. ბევრი პროგრამა, მათ შორის vi და GNU emacs, იყენებს terminfo ან
u.
curses ბიბლიოთეკებს (curses თავის მხრივ იყენებს terminfo-ს). შესაბამისად, თეორიულად,
ამ პროგრამებს შეუძლიათ ANSI-ის გარდა სხვა ტერმინალებში მუშაობაც, თუმცა დღეს, ეს
ო
ed
თ
ძალიან იშვიათად ხდება, რადგანაც ANSI კოდები თითქმის ყველა ტერმინალებისა და ემულა-
შა
u.
ერ
სადღეისოდ, ნამდვილი ტერმინალების ნაცვლად ტერმინალის ემულატორებსა და ვირ-
მუ
bt
მსგავს სისტემებში ცნობილია შემდეგი ტერმინალის ემულატორები. ზოგი მათგანი გრაფიკულ
მწ
სა
li@
გარემოშია (X Window System და Wayland) ინტეგრირებული, ზოგიც პირდაპირ ტექსტური
მო
გარემოდან ეშვება.
ჩამოვთვალოთ ზოგიერთი ცნობილი ტერმინალის ემულეტორი:
ის
vi
ბი
არ
sh
ფიკულ გარემოში.
ra
ეს
ba
კულ გარემოში.
ნი
GNOME-ში.
შე
ch
ar
შემცვლელად.
3
American National Standards Institute (ANSI) ამერიკის ეროვნული სტანდარტების ინსტიტუტი არის არამომ-
გებიანი ორგანიზაცია, რომელიც ხელს უწყობს შესაბამისობის სტანდარტების განვითარებას შეერთებულ შტატებში.
ANSI აგრეთვე წარმოადგენს შეერთებულ შტატებს საერთაშორისო სტანდარტების ორგანიზაციებში და ეხმარება მათ
შექმნან საყოველთაოდ მისაღები პრინციპები მრავალ ინდუსტრიაში
282
Rxvt XTerm-ის შემცვლელი ემულატორი. დასახელება მოდის გაფართოებუ-
ლი ვირტუალური ტერმინალიდან (extended virtual terminal).
:
ზე
ფუძნებულია GTK+ ბიბლიოთეკებზე. ერთ კლავიშზე დაჭერით შეგიძ-
ლიათ ახალი ფანჯრის გახსნა ან არსებულის დამალვა.
ა
GNU screen ტექსტური გარემოს ტერმინალის მულტიპლექსერი4 VT100/ANSI ტერ-
სტ
მინალის ემულაციით.
ა!
ო
tmux ტექსტური გარემოს გაუმჯობესებული ტერმინალის მულტიპლექსერი.
სი
ფ
რ
ge
.
ელ
Apple macOS სისტემებში ცნობილია Terminal, iTerm2 და სხვა. Microsoft Windows
ვე
u.
სისტემებში PUTTY, mintty (Cygwin ტერმინალი) და ა.შ.
თითოეული ტერმინალის ემულატორი კონკრეტული საკონტროლო სიმბოლოების ნაკ-
ო
ed
თ
რებს აღიქვამს. ლინუქსში TERM გარემოს ცვლადი შეიცავს იდენტიფიკატორს - სახელს ტერმი-
შა
u.
ერ
ვნახოთ, რა მნიშვნელობაა მოცემული ჩვენი gnome-terminal-ის TERM ცვლადში?
მუ
bt
მწ
li@
xterm-256color
მო
ის
sh
ra
ნიშნებსაც). მაგალითად, მათი შესრულების შედეგად ეკრანზე შეიძლება დავინახოთ, რომ კურ-
ეს
სორი გადაადგილდა ერთი პოზიციიდან მეორეზე ან გასუფთავდა ეკრანის ნაწილი, ჩვენ მიერ
შვ
ba
ბრძანება უყურებს TERM გარემოს ცვლადის მნიშვნელობას და იყენებს მასში ჩაწერილი ტერმი-
ch
ar
4
მულტიპლექსერი არის მოწყობილობა, სადაც ხდება არხების შემჭიდროება/გაერთიანება. მისი საშუალებით შე-
საძლებელია ერთი და იმავე არხით ერთდროულად რამდენიმე სიგნალის გაგზავნა. ტერმინალის მულტიპლექსერი
წარმოადგენს პროგრამას, რომელიც ტერმინალში მსგავსი მოწყობილობის ემულაციას აკეთებს.
283
Colors (foreground/background):
|black |blue |green |cyan |red |magenta|yellow |white |default
black | Words | Words | Words | Words | Words | Words | Words | Words | Words
blue | Words | Words | Words | Words | Words | Words | Words | Words | Words
green | Words | Words | Words | Words | Words | Words | Words | Words | Words
cyan | Words | Words | Words | Words | Words | Words | Words | Words | Words
:
ზე
red | Words | Words | Words | Words | Words | Words | Words | Words | Words
magenta| Words | Words | Words | Words | Words | Words | Words | Words | Words
ა
yellow | Words | Words | Words | Words | Words | Words | Words | Words | Words
სტ
white | Words | Words | Words | Words | Words | Words | Words | Words | Words
default| Words | Words | Words | Words | Words | Words | Words | Words | Words
ა!
ო
Colors (hue/saturation):
სი
ფ
red:
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
yellow:
შვ
ba
ნი
liz
შე
il.
ვთ
ch
ხო
ar
გთ
284
green:
ზე
ა
სტ
ა!
სი
ge
.
ელ
ვე
u.
ო
ed
თ
cyan:
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
blue:
il.
ვთ
ch
ხო
ar
გთ
285
:
magenta:
ზე
ა
სტ
ა!
სი
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
red:
მწ
სა
li@
Weights:
მო
vi
Postures:
ბი
არ
Text decorations:
ra
ეს
ba
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
liz
blue |normal|bold|normal|italic|normal|underlined|normal|
შე
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
e
green |normal|bold|normal|italic|normal|underlined|normal|
il.
ვთ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ch
cyan |normal|bold|normal|italic|normal|underlined|normal|
ხო
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
red |normal|bold|normal|italic|normal|underlined|normal|
ar
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
გთ
magenta|normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
yellow |normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
white |normal|bold|normal|italic|normal|underlined|normal|
286
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
default|normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
:
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ზე
blue |normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ა
green |normal|bold|normal|italic|normal|underlined|normal|
სტ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
cyan |normal|bold|normal|italic|normal|underlined|normal|
ა!
ო
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
სი
ფ
red |normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ge
magenta|normal|bold|normal|italic|normal|underlined|normal|
.
ელ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ვე
yellow |normal|bold|normal|italic|normal|underlined|normal|
u.
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ო
ed
თ
white |normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
შა
u.
default|normal|bold|normal|italic|normal|underlined|normal|
ერ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
მუ
bt
მწ
სა
li@
მო
xterm-256color ტიპის ტერმინალში კარგად ჩანს ფერების სიუხვე (256 ფერი). შევ-
ის
vi
sh
Colors (foreground/background):
შვ
black | Words | Words | Words | Words | Words | Words | Words | Words | Words
ნი
blue | Words | Words | Words | Words | Words | Words | Words | Words | Words
liz
green | Words | Words | Words | Words | Words | Words | Words | Words | Words
შე
cyan | Words | Words | Words | Words | Words | Words | Words | Words | Words
e
red | Words | Words | Words | Words | Words | Words | Words | Words | Words
magenta| Words | Words | Words | Words | Words | Words | Words | Words | Words
il.
ვთ
yellow | Words | Words | Words | Words | Words | Words | Words | Words | Words
ch
white | Words | Words | Words | Words | Words | Words | Words | Words | Words
default| Words | Words | Words | Words | Words | Words | Words | Words | Words
ხო
ar
Colors (hue/saturation):
გთ
red:
287
გთ
ხო
cyan:
green:
yellow:
ვთ ეს
ar შე არ
ch ნი ის
შვ სა
il. ნე
e liz ბი მუ
შა
ba მო ო
288
ra მწ ვე
sh ერ რ
vi
li@ ე თ
სი
ა!
bt ელ
u. .
ფ
ed ო
u. სტ
ge ა ზე
:
გთ
ხო
red:
blue:
ვთ
Weights:
magenta:
ეს
ar შე არ
ნი ის
289
ra მწ ვე
sh ერ რ
vi
li@ ე თ
სი
ა!
bt ელ
u. .
ფ
ed ო
u. სტ
ge ა ზე
:
Postures:
normal, italic, default
Text decorations:
normal, underlined, default
:
Colors (foreground) mixed with attributes:
ზე
black |normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ა
blue |normal|bold|normal|italic|normal|underlined|normal|
სტ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
green |normal|bold|normal|italic|normal|underlined|normal|
ა!
ო
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
cyan |normal|bold|normal|italic|normal|underlined|normal|
სი
ფ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
red |normal|bold|normal|italic|normal|underlined|normal|
ge
.
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ელ
magenta|normal|bold|normal|italic|normal|underlined|normal|
ვე
u.
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
yellow |normal|bold|normal|italic|normal|underlined|normal|
ო
ed
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
თ
white |normal|bold|normal|italic|normal|underlined|normal|
შა
ე
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
u.
ერ
default|normal|bold|normal|italic|normal|underlined|normal|
მუ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
bt
მწ
სა
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ის
blue |normal|bold|normal|italic|normal|underlined|normal|
vi
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ბი
არ
green |normal|bold|normal|italic|normal|underlined|normal|
sh
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ნე
cyan |normal|bold|normal|italic|normal|underlined|normal|
ra
ეს
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
შვ
red |normal|bold|normal|italic|normal|underlined|normal|
ba
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ნი
magenta|normal|bold|normal|italic|normal|underlined|normal|
liz
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
შე
yellow |normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
e
white |normal|bold|normal|italic|normal|underlined|normal|
il.
ვთ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
default|normal|bold|normal|italic|normal|underlined|normal|
ch
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ხო
ar
გთ
290
Colors (foreground/background):
|black |blue |green |cyan |red |magenta|yellow |white |default
black | Words | Words | Words | Words | Words | Words | Words | Words | Words
blue | Words | Words | Words | Words | Words | Words | Words | Words | Words
green | Words | Words | Words | Words | Words | Words | Words | Words | Words
cyan | Words | Words | Words | Words | Words | Words | Words | Words | Words
:
ზე
red | Words | Words | Words | Words | Words | Words | Words | Words | Words
magenta| Words | Words | Words | Words | Words | Words | Words | Words | Words
ა
yellow | Words | Words | Words | Words | Words | Words | Words | Words | Words
სტ
white | Words | Words | Words | Words | Words | Words | Words | Words | Words
default| Words | Words | Words | Words | Words | Words | Words | Words | Words
ა!
ო
Colors (hue/saturation):
სი
ფ
red:
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
yellow:
შვ
ba
ნი
liz
შე
il.
ვთ
ch
ხო
ar
გთ
291
green:
ზე
ა
სტ
ა!
სი
ge
.
ელ
ვე
u.
ო
ed
თ
cyan:
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
blue:
il.
ვთ
ch
ხო
ar
გთ
292
:
magenta:
ზე
ა
სტ
ა!
სი
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
red:
მწ
სა
li@
Weights:
მო
vi
Postures:
ბი
არ
Text decorations:
ra
ეს
ba
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
liz
blue |normal|bold|normal|italic|normal|underlined|normal|
შე
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
e
green |normal|bold|normal|italic|normal|underlined|normal|
il.
ვთ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ch
cyan |normal|bold|normal|italic|normal|underlined|normal|
ხო
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ar
red |normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
გთ
magenta|normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
yellow |normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
white |normal|bold|normal|italic|normal|underlined|normal|
293
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
default|normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
:
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ზე
blue |normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ა
green |normal|bold|normal|italic|normal|underlined|normal|
სტ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
cyan |normal|bold|normal|italic|normal|underlined|normal|
ა!
ო
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
სი
ფ
red |normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ge
magenta|normal|bold|normal|italic|normal|underlined|normal|
.
ელ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ვე
yellow |normal|bold|normal|italic|normal|underlined|normal|
u.
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
ო
ed
თ
white |normal|bold|normal|italic|normal|underlined|normal|
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
შა
u.
default|normal|bold|normal|italic|normal|underlined|normal|
ერ
|normal|bold+italic|normal|bold+underl|normal|italic+underl|normal|
მუ
bt
მწ
სა
li@
მო
ცხადია, ტერმინალის იმ ტიპების გარდა, რაც ზემოთ ვახსენეთ, ბევრი სხვაც არსებობს.
vi
შვ
ba
liz
არხით, რიგ შემთხვევებში, სხვა ქსელის გამოყენებითაც ხდება. ANSI სიმბოლოების გამოყენე-
ხო
294
გახდა, რასაც, თავის მხრივ, ANSI კოდების ფართო გამოყენება მოჰყვა. შედეგად, ANSI კოდე-
ბი სტანდარტად ჩამოყალიბდა ტერმინალის ემულატორებში. ამის გამო, ANSI კოდებს ხშირად
ANSI/VT100 ტერმინალის მართვის კოდებად მოიხსენიებენ.
ამ კოდების სრული დასახელებაა ANSI escape sequences და როგორც დასახელე-
ბიდან ჩანს, ისინი <Esc> სიმბოლოს შეიცავენ. ეს კოდები გენერირება Esc ღილაკის სა-
შუალებით ხდება. შელში კი მისი გამოძახება echo ბრძანებით არის შესაძლებელი. ამისთვის
:
echo-ს მისთვის გასაგები Backspash-escaped characters-სიმბოლოებიდან ერთ-ერთი, \e უნ-
ზე
და გადავცეთ. სწორედ ასე ხდება შელში Escape სიმბოლოს გაგება. Bash-ში მის მისაღებად
\e-ს ნაცვლად შეგვიძლია გამოვიყენოთ \033 ან \x1B ჩანაწერიც. სამივე Esc ღილაკის კოდს
ა
წარმოადგენს სხვადასხვა წარმოდგენაში - პირველი სიმბოლურში, მეორე რვაობითში, ხოლო
სტ
მესამე თექვსმეტობითში.
ა!
მოდით, პრაქტიკულ ღონისძიებებზე გადავიდეთ და ვცადოთ ტექსტის ფერში გამოტანა.
ო
ფერის მისაღებად შემდეგი ფორმატის ჩანაწერია საჭირო:
სი
ფ
რ
ge
achiko@debian:∼$ echo -e "\e[ფერიm ტექსტი\e[0m"
.
ელ
ვე
u.
აქ \e[ კოდი ფერის შემოტანის დასაწყისს აღნიშნავს, ფერიm ჩანაწერში ფერი და
” ”
ფორმატი მოიცემა შესაბამისი ნომრებით (m სიმბოლო დაფორმატირებული ჩანაწერის ნაწი-
ო
ed
თ
ლია. არ გამოგრჩეთ მისი მითითება!), ხოლო \e[0m კოდი ფორმატირების ყველა ატრიბუტის
”
შა
ე
დასასრულს ნიშნავს. ცხადია, შესაძლებელია Escape-ის კოდის სხვა ფორმატით მოცემაც.
u.
ერ
მუ
bt
achiko@debian:∼$ echo -e "\033[ფერიm ტექსტი\033[0m"
მწ
li@
მო
მოვიყვანოთ მაგალითი:
ის
vi
ბი
არ
sh
მწვანე ფონი
შვ
ba
ხაზგასმული
liz
შე
ar
გამარჯობა საქართველო
295
17.2.1 ძირითადი 8 ფერი
ტექსტის ფერი:
:
ხმევი ფერი
ზე
30 შავი echo -e "Default \e[30mBlack\e[0m" Default Default
ა
31 წითელი echo -e "Default \e[31mRed\e[0m" Default Red
სტ
32 მწვანე echo -e "Default \e[32mGreen\e[0m" Default Green
ა!
ო
33 ყვითელი echo -e "Default \e[33mYellow\e[0m" Default Yellow
სი
ფ
34 ლურჯი echo -e "Default \e[34mBlue\e[0m" Default Blue
ge
35 მეწამული echo -e "Default \e[35mMagenta\e[0m" Default Magenta
.
ელ
36 ცისფერი echo -e "Default \e[36mCyan\e[0m"
ვე Default Cyan
u.
37 ღია რუხი echo -e "Default \e[37mLight gray\e[0m" Default Light gray
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
li@
ხმევი ფერი
მო
vi
sh
შვ
liz
ვიყენოთ.
გთ
296
ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი ტექსტიტექსტი
achiko@debian:∼$ for i in `seq 100 107`
> do
> echo -e "\e[${i}m ტექსტი \e[0m"
> done; echo
ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი
:
ა ზე
ტექსტის ფორმატი:
სტ
კოდი აღწერა ნიმუში შედეგი
ა!
ო
1 ადაპტირე- echo -e "Normal \e[1mBold\e[0m" Normal Bold
სი
ფ
ბული (Bold)
2 ბაცი (Dim) echo -e "Normal \e[2mDim\e[0m" Normal Dim
ge
.
ელ
3 კურსივი echo -e "Normal \e[3mItalic\e[0m" Normal Italic
ვე
u.
(Italic)
4 ხაზგასმული echo -e "Normal \e[4mUnderline\e[0m" Normal Underline
ო
ed
თ
(Underline)
შა
5 ციმციმა ე
echo -e "Normal \e[5mBlink\e[0m" Normal Blinking
u.
ერ
(Blink)
მუ
bt
7 შებრუნებული echo -e "Normal \e[7mInverted\e[0m" Normal Inverted
მწ
(Inverted)
სა
li@
8 დაფარული echo -e "Normal \e[8mHidden\e[0m" Normal
მო
(Hidden)
ის
vi
ბის მოხსნა
sh
ნე
შვ
მუქ (bold) ფორმატთან კომბინაციაში ტექსტის ფერი უფრო ღია ელფერს იღებს. დავ-
ba
liz
#!/ bin/bash
შე
for i in 0 1
e
do
il.
ვთ
done
ar
echo
გთ
done
achiko@debian:∼$ ./script XYZ.sh
ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი
ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი ტექსტი
297
17.2.2 256 ფერი
როგორც უკვე ვნახეთ, ჩვენი ტერმინალი (gnome-terminal) 256 სხვადასხვა ფერს არ-
ჩევს. ვნახოთ, ANSI-ის რომელი კოდები უზრუნველყოფენ ამ ფერებით ტექსტის ფორმატირე-
ბას. თავად, ტექსტისთვის ფერის მისაცემად შემდეგი სპეციალური სინტაქსი უნდა გამოვიყე-
ნოთ:
:
ზე
achiko@debian:∼$ echo -e "\e[38;5;Xm ტექსტი \e[0m"
ა
სტ
ამ სინტაქსურ ჩანაწერში X-ის ადგილზე მხოლოდ ფერის კოდია მისათითებელი. ფერი
კი [0-256] ინტერვალში ვარირებს.
ა!
მაგალითი:
ო
სი
ფ
achiko@debian:∼$ echo -e "\e[38;5;200m ტექსტი \e[0m"
ge
ტექსტი
.
ელ
ვე
u.
ყველა ფერზე წარმოდგენა რომ შეგვექმნას, სათითაოდ ვნახოთ 256-ვე ფერი და შესა-
ბამისი კოდები:
ო
ed
თ
შა
u.
ერ
> do
მუ
bt
> echo -e "\e[38;5;${i}m ${i}\t\e[0m"
მწ
li@
0 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 32 33 34 35 36 37 38 39
vi
40 41 42 43 44 45 46 47 48 49
ბი
არ
50 51 52 53 54 55 56 57 58 59
sh
60 61 62 63 64 65 66 67 68 69
70 71 72
ნე
73 74 75 76 77 78 79
ra
80 81 82 83 84 85 86 87 88 89
ეს
90 91 92 93 94 95 96 97 98 99
შვ
100 101 102 103 104 105 106 107 108 109
ba
110 111 112 113 114 115 116 117 118 119
ნი
120 121 122 123 124 125 126 127 128 129
liz
130 131 132 133 134 135 136 137 138 139
140 141 142 143 144 145 146 147 148 149
შე
150 151 152 153 154 155 156 157 158 159
e
160 161 162 163 164 165 166 167 168 169
il.
170 171 172 173 174 175 176 177 178 179
ვთ
180 181 182 183 184 185 186 187 188 189
ch
190 191 192 193 194 195 196 197 198 199
200 201 202 203 204 205 206 207 208 209
ხო
210 211 212 213 214 215 216 217 218 219
ar
220 221 222 223 224 225 226 227 228 229
230 231 232 233 234 235 236 237 238 239
გთ
240 241 242 243 244 245 246 247 248 249
250 251 252 253 254 255
298
achiko@debian:∼$ echo -e "\e[48;5;Xm ტექსტი \e[0m"
:
achiko@debian:∼$ for i in `seq 0 256`
ზე
> do
> echo -e "\e[48;5;${i}m ${i} \t\e[0m"
ა
> done; echo
სტ
0 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 32 33 34 35 36 37 38 39
სი
ფ
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
ge
.
70 71 72 73 74 75 76 77 78 79
ელ
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 ვე
97 98 99
u.
100 101 102 103 104 105 106 107 108 109
110 111 112 113 114 115 116 117 118 119
ო
ed
თ
120 121 122 123 124 125 126 127 128 129
შა
130 131 132 133 134 135 136 137 138 139
140 141 142 143 144 145 ე
146 147 148 149
u.
ერ
150 151 152 153 154 155 156 157 158 159
მუ
160 161 162 163 164 165 166 167 168 169
bt
170 171 172 173 174 175 176 177 178 179
მწ
180 181 182 183 184 185 186 187 188 189
სა
li@
190 191 192 193 194 195 196 197 198 199
მო
200 201 202 203 204 205 206 207 208 209
210 211 212 213 214 215 216 217 218 219
ის
220 221 222 223 224 225 226 227 228 229
vi
230 231 232 233 234 235 236 237 238 239
ბი
არ
240 241 242 243 244 245 246 247 248 249
sh
ra
ეს
ba
liz
> do
e
0 0 0 0 0 0 0 0 0 0 0
ch
ხო
299
achiko@debian:∼$ echo -e "\ ასო-ნიშანი"
\ ასო-ნიშანი
achiko@debian:∼$ echo -e "\\ ასო-ნიშანი"
\ ასო-ნიშანი
achiko@debian:∼$ echo -e "\\\ ასო-ნიშანი"
\ ასო-ნიშანი
:
achiko@debian:∼$ echo -e "\\\\ ასო-ნიშანი"
ზე
\ ასო-ნიშანი
achiko@debian:∼$ echo -e "ორი \\\\\ ასო-ნიშანი"
ა
სტ
ორი \\ ასო-ნიშანი
ა!
ო
ერთი შეხედვით დამაბნეველი, თუმცა ლოგიკური შედეგი მივიღეთ. მოდით, გავარ-
კვიოთ, თუ რატომ გამოვიდა ასე. გავიხსენოთ, რომ \ და " სიმბოლოები უკარგავენ სხვა
სი
ფ
ასო-ნიშნებს თავიანთ ფუნქციას (\-ის შემთხვევაში გამონაკლისია ახალ ხაზზე გადასვლა -
<newline>, ხოლო ბრჭყალის შეთხვევაში $, ` და \ სიმბოლოები). ბრჭყალებში მოცემული \
ge
.
სიმბოლო ინარჩუნებს ფუნქციას, როდესაც მას მოსდევს ერთ-ერთი ამ სიმბოლოთაგანი: $, `,
ელ
ვე
\ ან <newline>. აქედან გამომგდინარეობს, რომ \ სიმბოლოს ყოველთვის სპეციალური დანიშ-
u.
ნულება არ აქვს. ამის გარდა, echo ბრძანება e ოფციით \ სომბოლოთი დაწყებულ ასო-ნიშნების
გარკვეულ თანმიმდევრობას თავისებურად აღიქვამს. (\n ახალ ხაზზე გადასავლაა, \\ კი თავად
ო
ed
თ
\). დავაკვირდეთ ზემოთმოყვანილ მაგალითებს და უკვე აღარ უნდა გაგვიჭირდეს მიღებული
შა
შედეგის ახსნა:
ე
u.
ერ
მუ
bt
1. echo -e "\ ასო-ნიშანი" - არაფერი განსაკუთრებული. რჩება ერთი \.
მწ
სა
li@
2. echo -e "\\ ასო-ნიშანი" - პირველი \ ბაშს ეუბნება აღიქვას მეორე \, როგორც
სიმბოლო \. echo-საც გამოაქვს ერთი \.
მო
ის
sh
ra
სიმბოლო \. მესამე \ იგივეს ეუბნება მეოთხე \-ზე. echo იღებს \\-ს და -e ოფციის გამო
ეს
ba
5. echo -e "ორი \\\\\ ასო-ნიშანი" - პირველი \ ბაშს ეუბნება აღიქვას მეორე \, რო-
ნი
გორც სიმბოლო \. მესამე \ იგივეს ეუბნება მეოთხე \-ზე. ბოლო \-ს სპეციალური დატ-
liz
ვირთვა არ აქვს. echo იღებს \\\-ს და -e ოფციის გამო საწყისი \\ აღიქმება, როგორც
შე
ლის მოსაწვევი ფერებითაა მოცემული. ვნახოთ, თუ როგორ გამოიყურება PS1 ცვლადის მნიშ-
ვნელობა:
გთ
300
აშკარაა, რომ მასში ANSI escape sequences არის გამოყენებული. გამოსასვლელზე
მიღებული შედეგი გრძელი ჩანაწერია და მის გასარჩევად უმჯობესია, ის ნაწილ-ნაწილ დავყოთ.
მოდით, შემდეგი სამი ფრაგმენტი ავიღოთ:
1. \[\e]0;\u@\h: \w\a\]
2. ${debian_chroot:+($debian_chroot)}
:
ზე
3. \[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$
ა
პირველ ფრაგმენტში გამოყენებულია <ESC> ] კოდი (შელში \e] ). მისი მოკლე და-
სტ
”
სახელებაა OSC (Operating System Command) და ის გარკვეული სტრინგის გადაცემას იწყებს
ოპერაციული სისტემისთვის. მისი დასრულება ხდება <ESC> \კოდით (შელში \e\ ). მოკ-
ა!
ო
”
ლე დასახელებაა ST (String Terminator). xterm-ში OSC-ს დასრულება BELL კოდითაც ხდება
სი
ფ
(შელში \a] ). ფანჯარაში გაშვებულ xterm-ში, ამ ფანჯრის დასახელების განსაზღვრა შეგვიძ-
”
ლია შემდეგი კოდების გაშვებით: OSC 0; სათაურის ტექსტი BEL (შელში მისი ექვივალენტია
ge
.
\e]0;ახალი სათაური\a ).
ელ
”
ვე
სანამ, იმ ფანჯრის სათაურს შევცვლით, სადაც ჩვენი ტერმინალია გახსნილი, ჯერ პირ-
u.
ველად ვარიანტს შევხედოთ, რათა დავრწმუნდეთ ჩვენი ბრძანების მართებულობაში.
ო
ed
თ
achiko@debian:∼
შა
u.
ერ
achiko@debian:∼$
მუ
bt
მწ
სა
li@
მო
ის
vi
ახალი სათაური
ბი
არ
sh
ot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$
ra
ეს
achiko@debian:∼$
შვ
ba
ნი
liz
შე
არაფერი გამოვა. წინააღმდეგ შემთხვევაში, მივიღებთ word-ს. ახლა ჩვენი შემთხვევა განვი-
ar
ახალი სათაური
301
როგორც ჩანს, debian chroot ცვლადი არ არის განსაზღვრული. შესაბამისად, ეს
ფრაგმენტი არაფრით შეიცვლება. ამ ცვლადს რაიმე მნიშვნელობა ჰქონოდა მინიჭებული,
${debian chroot:+($debian chroot)} ჩანაწერი debian chroot-ის მნიშვნელობით შეიცვლე-
ბოდა. ამ ცვლადის არსის უკვეთ გასაგებად, ჯერ ვთქვათ, რა არის chroot ოპერაცია. Unix-ის
მსგავს სისტემებში chroot ბრძანება გამოიყენება პროცესის ძირეული დირექტორიის (root დი-
რექტორიის) შესაცვლელად. ასეთ შეცვლილ გარემოში გაშვებული პროცესი/პროგრმა ვეღარ
შეძლებს ახალი root დირექტორიის გარეთ არსებულ ფაილებთან წვდომას. თუ chroot ოპე-
:
ზე
რაცია განხორციელდა, debian chroot ცვლადს ახალი ძირეული დირექტორიის სახელი მიე-
ნიჭება. შესაბამისაც, PS1-ის ამ ფრაგმენტის არსებობა უზრუნველყოფს იმას, რომ ადვილად
ა
მივხვდეთ შეზღუდულ გარემოში ვიმყოფებით თუ არა ფაილების წვდომის თვალსაზრისით.
სტ
მესამე ფრაგმენტი ჩვენთვის უკვე კარგად ნაცნობი ფერების კოდებს შეიცავს.
ა!
ო
ახალა ზემოთაღნიშნული ფერების საშუალებით შეგვიძლია სურვილისამებრ განვსა-
სი
ფ
ზღვროთ შელის მოსაწვევი, რათა უფრო მეტი კომფორტი შევიტანოთ შელში მუშაობის პრო-
ცესში. მოვიყვანოთ მარტივი მაგალითები:
ge
.
ელ
ვე
u.
achiko@debian:∼$ PS1="თქვენ უშვებთ ბრძანებას ნომრით \e[1;31m \!\e[0m \$ "
თქვენ უშვებთ ბრძანებას ნომრით 2010 $ echo $RANDOM > /dev/null
ო
ed
თ
თქვენ უშვებთ ბრძანებას ნომრით 2011 $ ls > /dev/null
შა
u.
ერ
მუ
bt
გასათვალისწინებელია ის, რომ bash-ში PS1 ცვლადში escape sequences გამოყენე-
მწ
li@
მოსაწვევის სიგრძეს სწორად ვერ აღიქვამს.
მო
ის
ჭარბებს:
ბი
არ
sh
ra
ეს
შვ
ნაცვლად, იგივე ხაზზე გაგრძელდა ბრძანების ტექსტის შეყვანა. სწორედ ამიტომ უნდა მოვაქ-
ნი
ssssssssssssssss
ch
ხო
კიდევ ერთი დეტალი აღვნიშნოთ. ზემოთ ვახსენეთ, რომ ფერის კოდის შემოტანის შემ-
დეგ, მისი დასრულების კოდიც \e[0m უნდა მივუთითოთ ბოლოს. ეს ფორმატირების ყველა
”
ატრიბუტის დასასრულს ნიშნავს. ამ კოდის გარეშე ფორმატი შენარჩუნდება და შემდეგ, ეკრან-
ზე შეყვანილი თუ გამოტანილი მონაცემიც ამ ფორმატს მიიღებს. PS1-ის მაგალითზე კარგად
გამოჩნდება ეს განსხვავება:
302
თქვენ უშვებთ ბრძანებას ნომრით 2016 $ PS1="\[\e[31m\] PS1 \[\e[0m\]"
PS1 whoami
achiko
PS1 PS1="\[\e[31m\] PS1 " # დასრულების კოდის გარეშე
PS1 whoami
achiko
:
ზე
ფორმატის დასრულების კოდის გარეშე აკრეფილი ბრძანებისა და მისი შედეგისთვისაც
ა
შელმა ჩარჩენილი ფორმატი შეინარჩუნა და ისინი ეკრანზე წითელ ფერში გამოსახა.
”
სტ
შელის მოსაწვევში გაკეთერული ცვლილება მხოლოდ მიმდინარე სესიაზე ვრცელდება.
ახალი ტერმინალი რომ გავხსნათ, კვლავ ძველი მოსაწვევი დაგვხვდება. ცვლილების მუდმივად
ა!
ო
შესანახად PS1 ცვლადი ახალი მნიშვნელობით $HOME/.bashrc ფაილში უნდა გავწეროთ.
სი
ფ
$ echo ’PS1="\[\e[31m\] New PS1 \$ \[\e[0m\]"’ >> .$HOME/.bashrc
ge
.
ელ
ვე
u.
ამის შემდეგ, ყოველ ახლად გახსნილ ტერმინალში შელის ახალი მოსაწვევი დაგვხვდე-
ბა. $HOME/.bashrc ფაილს დეტალურად მოგვიანებით დავუბრუნდებით.
ო
ed
თ
შა
u.
ერ
მუ
bt
17.3 კურსორის მართვა
მწ
სა
li@
ANSI კოდები, ფერების გარდა, შეიცავენ ისეთ კოდებს, რომლებიც ეხება ტერმინა-
მო
sh
ra
ეს
achiko@debian:∼$
შვ
achiko@debian:∼$
ba
achiko@debian:∼$
ნი
achiko@debian:∼$
liz
achiko@debian:∼$
შე
achiko@debian:∼$
e
ch
ხო
ar
achiko@debian:∼$ 1
გთ
303
achiko@debian:∼$
achiko@debian:∼$ 1
achiko@debian:∼$
achiko@debian:∼$
achiko@debian:∼$
achiko@debian:∼$
:
achiko@debian:∼$ echo -e "\e[5B"
ა ზე
სტ
ა!
ო
achiko@debian:∼$ echo -e "\e[H"
სი
ფ
რ
ge
.
ელ
ვე
u.
ნიმუშად მოყვანილი ტერმინალის კოდების გარდა, ბევრი სხვა კოდი არსებობს. უფ-
რო მეტიც, არსებობს არაერთი ტიპის ტერმინალები. თუმცაღა, ამ უამრავი ტერმინალის კონ-
ო
ed
თ
ტროლის ენების ცოდნა და მათი კოდების დამახსოვრება არ გვჭირდება, რადგან სისტემაში
შა
u.
ერ
იმის ნაცვლად, რომ ამ უამრავი ტერმინალის კონტროლის სხვადასხვა ენა ვიცოდეთ და
მუ
მათი კოდები დავიმახსოვროთ, როგორც წესი, სისტემას აქვს შუალედური კომუნიკაციის ფენა.
bt
რეალური კოდები იძებნება მიმდინარე ტერმინალის ტიპის მონაცემთა ბაზაში (terminfo). ჩვენ
მწ
სა
sh
ra
ეს
შვ
ba
კურსორის მართვა
ნი
კუთხეს შეესაბამება.
e
il.
ch
304
lines სტრიქონების რაოდენობა ტერმინალის ეკრანზე. ტერმინალის ემულატორის ფან-
ჯრის გადიდება/დაპატარავების შემთხვევაში, სტრიქონების რაოდენობა, ცხადია,
შეიცვლება.
:
ზე
ტექსტის სხვადასხვა ატრიბუტი
ა
სტ
bold "bold"(მუქი) ატრიბუტის დაყენება.
ა!
dim "dim"(ბაცი) ატრიბუტის დაყენება.
ო
სი
ფ
smul "underline"(ხაზგასმული) ატრიბუტის დაყენება. მისი გამორთვა ხდება rmul ატრი-
ბუტით.
ge
.
rev "reverse"(შებრუნებული) ატრიბუტის დაყენება. ამ დროს ტექსტის ფერი და მისი
ელ
ფონის ფერი გადანაცვლდება.
ვე
u.
invis "hidden"(დაფარული) ატრიბუტის დაყენება.
ო
ed
თ
sgr0 ყველა ატრიბუტის საწყის მნიშვნელობაზე დაყენება.
შა
u.
ერ
მუ
bt
მწ
ტექსტის ფერები
სა
li@
setaf 0 ტექსტის მოცემა #0 ფერში (შავი - black). მისი ექვივალენტი ANSI კოდი არის
მო
[30m.
ის
vi
setaf 1 ტექსტის მოცემა #1 ფერში (წითელი - red). მისი ექვივალენტიი ANSI კოდი არის
ბი
არ
sh
[31m.
ნე
setaf 2 ტექსტის მოცემა #2 ფერში (მწვანე - green). მისი ექვივალენტი ANSI კოდი არის
ra
ეს
[32m.
შვ
ba
setaf 3 ტექსტის მოცემა #3 ფერში (ყვითელი - yellow). მისი ექვივალენტი ANSI კოდი
არის [33m.
ნი
liz
setaf 4 ტექსტის მოცემა #4 ფერში (ლურჯი - blue). მისი ექვივალენტი ANSI კოდი არის
შე
[34m.
e
setaf 5 ტექსტის მოცემა #5 ფერში (მეწამული - megenta). მისი ექვივალენტი ANSI კოდი
il.
ვთ
არის [35m.
ch
setaf 6 ტექსტის მოცემა #6 ფერში (ცისფერი - cyan). მისი ექვივალენტი ANSI კოდი არის
ხო
[36m.
ar
setaf 7 ტექსტის მოცემა #7 ფერში (თეთრი - white). მისი ექვივალენტი ANSI კოდი არის
გთ
[37m.
setaf 9 ტექსტის მოცემა ნაგულისხმევ ფერში. მისი ექვივალენტი ANSI კოდი არის [39m.
305
ტექსტის ფონის ფერები
setab 0 ტექსტის ფონის მოცემა #0 ფერში (შავი - black). მისი ექვივალენტი ANSI კოდი
არის [30m.
setab 1 ტექსტის ფონის მოცემა #1 ფერში (წითელი - red). მისი ექვივალენტი ANSI კოდი
:
ზე
არის [31m.
setab 2 ტექსტის ფონის მოცემა #2 ფერში (მწვანე - green). მისი ექვივალენტი ANSI
ა
კოდი არის [32m.
სტ
setab 3 ტექსტის ფონის მოცემა #3 ფერში (ყვითელი - yellow). მისი ექვივალენტი ANSI
ა!
ო
კოდი არის [33m.
სი
ფ
setab 4 ტექსტის ფონის მოცემა #4 ფერში (ლურჯი - blue). მისი ექვივალენტი ANSI კოდი
არის [34m.
ge
.
ტექსტის ფონის მოცემა #5 ფერში (მეწამული - megenta). მისი ექვივალენტი
ელ
setab 5
ANSI კოდი არის [35m.
ვე
u.
setab 6 ტექსტის ფონის მოცემა #6 ფერში (ცისფერი - cyan). მისი ექვივალენტი ANSI
ო
ed
თ
კოდი არის [36m.
შა
setab 7
ე
ტექსტის ფონის მოცემა #7 ფერში (თეთრი - white). მისი ექვივალენტი ANSI
u.
ერ
კოდი არის [37m.
მუ
bt
setab 9 ტექსტის ფონის მოცემა ნაგულისხმევ ფერში. მისი ექვივალენტი ANSI კოდი არის
მწ
სა
[39m.
li@
მო
ის
ზემოთ ჩამოთვლილი cupname-ები - setaf და setab უნდა გამოვიყენოთ. მათი ფუნქცია დასა-
ბი
არ
ხელებიდანაც კარგად ჩანს - setaf (set ANSI foreground), setab (set ANSI background). სხვა
sh
ტერმინალში:
ნი
liz
შე
86
ch
ხო
ვცადოთ:
306
achiko@debian:∼$ tput cols
86
achiko@debian:∼$ tput cup 15 43; echo Mishka
:
Mishka
ზე
achiko@debian:∼$
ა
სტ
ა!
ო
სი
ფ
ჰმმმ... ბოლომდე ის არ გამოვიდა, რასაც ველოდით. გავაანალიზოთ და გავაუმჯობე-
ge
.
სოთ შედეგი. უპირველეს ყოვლისა, ეკრანი უნდა გავასუფთავოთ, რათა აქ აკრეფილი ბრძა-
ელ
ვე
ნებები არ ჩანდეს. ამას გარდა, კურსორი ცენტრში კი გადავაადგილეთ, მაგრამ თუ ტერმინა-
u.
ლის ფანჯრის ზომას დავაპატარავებთ ან გავზრდით ახალი ეკრანის ცენტრი აღარ დაემთხვევა
ჩვენს კოორდინატებს. ამიტომ, უმჯობესია, ცენტრის კოორდინატები ფარდობითი მნიშვნელო-
ო
ed
თ
ბით ავიღოთ და ეკრანის მიმდინარე ზომებს მივაბათ. ამის მიუხედავად, კურსორის ცენტრში
შა
ე
გადაყვანის შემთხვევაშიც კი, ჩვენი სასურველი სიტყვის გამოტანა, ზუსტად ცენტში არ განთავ-
u.
ერ
სდა. მართალია, Mishka-ს დაწერა ცენტრიდან დაიწყო, მაგრამ Mishka-ს სიგრძე მხედველო-
მუ
ბაში არ მიგვიღია. გარდა ამისა, Mishka-ს დაბეჭდვის შემდეგ შელის მოსაწვევი ჯობს ბოლო
bt
ხაზზე ჩავიტანოთ. მოდით, გავითვალისწინოთ ეს შენიშვნები, გავუშვათ შემდეგი ბრძანება და
მწ
სა
ვნახოთ რა გამოვა:
li@
მო
ის
$ A=MISHKA
ბი
არ
$ tput clear; tput cup $(($X/2)) $(($Y/2-${#A}/2)); echo $A; tput cup $X 0
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
MISHKA
ch
ხო
ar
გთ
achiko@debian:∼$
307
ახლა ყველაფერი რიგზეა. შეგვიძლია დასაბეჭდი მონაცემის სიგრძე გავზარდოთ და
ფანჯრის ზომაც შევცვალოთ. ამ ბრძანებით ტექსტი მაინც ცენტრში დაიბეჭდება.
:
ა ზე
სტ
ა!
ო
სი
ფ
რ
ge
MISHKA, NINO, IO ...
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
achiko@debian:∼$
მუ
bt
მწ
სა
$ tput clear; tput cup $(($X/2)) $(($Y/2-${#A}/2)); tput bold; tput setab
ბი
არ
ra
ეს
შვ
ba
ნი
liz
შე
ch
ხო
ar
გთ
achiko@debian:∼$
308
achiko@debian:∼$ echo "$(tput setaf 1)ANSI$(tput sgr0) კოდების ნაც-
ვლად, უმჯობესია, მომხმარებლისთვის მარტივად გამოყენებადი - $(tput setaf
2)tput$(tput sgr0) ბრძანება გამოიყენოთ!"
ANSI კოდების ნაცვლად, უმჯობესია, მომხმარებლისთვის მარტივად გამოყენებადი
- tput ბრძანება გამოიყენოთ!
:
ზე
tput ბრძანებით შესაძლებელია პატარა ხმოვანი სიგნალის გამოტანაც. ასე:
ა
სტ
achiko@debian:∼$ tput bel
ა!
ო
შელის მოსაწვევის განსაზღვრისას tput ბრძანებაც შეგვიძლია გამოვიყენოთ ფერების
მოსაცემად. ფერის კოდი [0,256] ინტერვალიდან შეგვიძლია ავიღოთ, თუ, რა თქმა უნდა, ტერ-
სი
ფ
მინალს ამდენი ფერის მხარდაჭერა აქვს.
ge
.
ელ
achiko@debian:∼$ PS1="\[$(tput setaf 200)\]\u@\h:\w $ \[$(tput sgr0)\]"
ვე
u.
achiko@debian:∼$
ო
ed
თ
PS1 ცვლადში შეგიძლიათ, აგრეთვე, შელის ნებისმიერი ბრძანება (სკრიფტი, ფუნქცია
შა
ე
ან სხვა) ჩასვათ. სასურველია, ის ბევრ მონაცემს არ შეიცავდეს გამოსასვლელზე და, ამავდრო-
u.
ერ
ულად, დარწმუნებული იყოთ, რომ საქმე სწრაფად შესრულებად ბრძანებას ეხება, რადგან ის
მუ
მოსაწვევის ყოველი გამოჩენისას გაეშვება. ასე მაგალითად, ისეთი მოსაწვევი შევქმნათ, რო-
bt
მელიც მიმდინარე პროცესების რაოდენობას გამოიტანს:
მწ
სა
li@
მო
sh
ra
ეს
”
ნი
დაიმახსოვრეთ!
liz
შე
დინამიკურად ცვალებადი.
ch
ხო
ar
309
# Reconstructed via infocmp from file: /lib/terminfo/x/xterm-256color
xterm-256color|xterm with 256 colors,
am, bce, ccc, km, mc5i, mir, msgr, npc, xenl,
colors#256, cols#80, it#8, lines#24, pairs#32767,
acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
:
clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=^M,
ზე
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
ა
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
სტ
cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
ა!
ო
el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
სი
ფ
hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
il=\E[%p1%dL, il1=\E[L, ind=^J, indn=\E[%p1%dS,
ge
.
...
ელ
ვე
u.
tput ბრძანებას, terminfo-ს მდიდარი მონაცემთა ბაზის წყალობით, ძალიან ბევრი შე-
საძლებლობა (cupname) აქვს. მათი სრული სიის სანახავად, მიმართეთ terminfo-ს სახელ-
ო
ed
თ
მძღვანელო გვერდს - man terminfo.
შა
u.
ერ
მუ
bt
მწ
სა
li@
ტერმინალის მულტიპლექსერი არ არის ფიზიკური მოწყობილობა, არამედ წარმოად-
მო
ვება სურს, ხოლო წვდომა მხოლოდ ერთ ტერმინალთან აქვს (მაგალითად ტერმინალზე დის-
ნე
ტანციურად დაკავშირებისას).
ra
ეს
კომპიუტერს, შეძლებს დაუბრუნდეს თავის გაშვებულ წინა სესიას, საკუთარ სამუშაო გარემოს.
e
არსებობას.
ch
ხო
310
achiko@debian:∼$ screen
:
Sadrul Habib Chowdhury
ზე
Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 Juergen Weigert, Michael
Schroeder
ა
Copyright (c) 1987 Oliver Laumann
სტ
This program is free software; you can redistribute it and/or modify it
ა!
ო
under the terms of the GNU General Public License as published by the
სი
ფ
Free Software Foundation; either version 3, or (at your option) any later
version.
ge
.
ელ
This program is distributed in the hope that it will be useful, but
ვე
u.
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
ო
ed
თ
Public License for more details.
შა
u.
You should have received a copy of the GNU General Public License along
ერ
მუ
bt
[Press Space for next page; Return to end.]
მწ
სა
li@
მო
ლია მიხვდეთ, რომ screen გაშვებულია, თუმცაღა გაშვებული პროცესების სიაში რომ ჩაიხე-
vi
sh
ნე
achiko@debian:∼$ ps -ejH
ra
ეს
...
შვ
...
ch
311
screen ბრძანების შესრულებით გაეშვა screen-ის ერთი სესია, სადაც შეიქმნა ახალი, პირველი
ფანჯარა. სწორედ ამ ფანჯარაში გაშვებულ შელში შეგვიძლია გავუშვათ სასურველი ბრძანებე-
ბი. ასევე, შეგვიძლია ეს ფანჯარა დროებით დავტოვოთ და, მოგვიანებით, კვლავ დავუბრუნდეთ
მას. მაგალითისთვის გავუშვათ რომელიმე ისეთი ბრძანება, რომელიც დიდხანს გრძელდება:
:
ფანჯარა 1 - 19790
ზე
ფანჯარა 1 - 28242
ფანჯარა 1 - 28638
ა
ფანჯარა 1 - 5494
სტ
ფანჯარა 1 - 7251
ფანჯარა 1 - 13115
ა!
ო
ფანჯარა 1 - 8859
სი
ფ
ფანჯარა 1 - 14996
ფანჯარა 1 - 6684
ge
.
ფანჯარა 1 - 21119
ელ
ფანჯარა 1 - 27570
ვე
u.
ფანჯარა 1 - 11992
ფანჯარა 1 - 1832
ო
ed
თ
ფანჯარა 1 - 7085
შა
...
ე
u.
ერ
მუ
bt
ბინაცია. შედეგად, ეკრანზე შემდეგი ინფორმაცია გამოვა:
მწ
სა
li@
მო
achiko@debian:∼$ screen
ის
achiko@debian:∼$
ბი
არ
sh
ra
შვ
კომპიუტერის სახელი).
ნი
...
il.
ვთ
ფანჯარა 1 - 10238
ფანჯარა 1 - 14134
ch
ფანჯარა 1 - 18583
ხო
ფანჯარა 1 - 23894
ar
ფანჯარა 1 - 28460
გთ
ფანჯარა 1 - 13740
ფანჯარა 1 - 12737
ფანჯარა 1 - 6717
ფანჯარა 1 - 23422
ფანჯარა 1 - 18642
312
ფანჯარა 1 - 4294
ფანჯარა 1 - 24691
ფანჯარა 1 - 45179
ფანჯარა 1 - 36598
...
:
ზე
ნათელია, რომ სესიის ფანჯარაში ჩვენ მიერ გაშვებული ბრძანება არ შეწყვეტილა და
გრძელდება. სესიაზე დაბრუნება მოკლედ ასეც შეგვეძლო:
ა
სტ
achiko@debian:∼$ screen -r 1099
ა!
ო
თუ screen-ით ერთადერთი სესიაა გახსნილი, მაშინ არგუმენტის მიწერაც აღარ არის
სი
ფ
აუცილებელი:
ge
.
ელ
achiko@debian:∼$ screen -r
ვე
u.
სახელის არგუმენტად მითითება მხოლოდ მაშინაა აუცილებელი, თუ რამდენიმე სე-
ო
ed
თ
სია გვაქვს გახსნილი. გახსნილი სესიების ჩამონათვალი -list ან -ls ოფციის გამოყენებით
შა
შეგვიძლია ვნახოთ:
ე
u.
ერ
მუ
bt
There are screens on:
მწ
სა
li@
6171.pts-0.mypc (08/21/2019 01:32:03 PM) (Detached)
მო
2 Sockets in /run/screen/S-achiko.
vi
ბი
არ
დასახელება მივანიჭოთ.
ra
ეს
შვ
ch
ar
313
ფანჯრის დახურვა Ctrl^a + k კლავიშების კომბინაციაზე დაჭერის შედეგად ხდება.
როგორც დასაწყისშივე ვთქვით, შესაძლებელია ტერმინალის მულტიპლექსერის ეკრა-
ნის მრავალ ნაწილად დაყოფა და თითოეულ მათგანში ფანჯრის გაშვება. მაგალითისთვის, დავ-
ყოთ ჩვენი ფანჯარა ორ ვერტიკალურ ნაწილად. ამისთვის ჯერ screen გავუშვათ (თუ ტერმი-
ნალში ის გაშვებული არ არის), შემდეგ კი Ctrl^a + | კლავიშების კომბინაციას დავაჭიროთ.
დავინახავთ, რომ ფანჯარა ორად გაიყო ვერტიკალურად:
:
ზე
ფანჯარა 1 - 13614
ა
ფანჯარა 1 - 13614
სტ
ფანჯარა 1 - 11110
ფანჯარა 1 - 5500
ა!
ფანჯარა 1 - 20498
ო
ფანჯარა 1 - 20357
სი
ფ
ფანჯარა 1 - 11270
ფანჯარა 1 - 1018
ge
.
ფანჯარა 1 - 29255
ელ
ფანჯარა 1 - 11032
ვე
u.
ფანჯარა 1 - 18808
ფანჯარა 1 - 29026
ო
ed
თ
ფანჯარა 1 - 587
შა
ფანჯარა 1 - 15063
ე
u.
ერ
ფანჯარა 1 - 1567
მუ
ფანჯარა 1 - 3759
bt
^C
მწ
სა
achiko@debian:∼$
li@
0 bash --
მო
ის
vi
ბა. ერთი დანაყოფიდან მეორეზე გადასვლა Ctrl^a + tab კლავიშების კომბინაციით ხდე-
sh
ბა. გადავიდეთ და გავუშვათ რაიმე ბრძანება. ჩვენი აკრეფილი ეკრანზე არ გამოჩნდა. შელის
ნე
მასში ჯერ ახალი ფანჯრის შექმნაა საჭირო, სადაც bash იქნება გაშვებული. მისი უზრუნვეყო-
შვ
liz
შე
ფანჯარა 1 - 20498
ხო
ფანჯარა 1 - 20357
ar
ფანჯარა 1 - 11270
გთ
ფანჯარა 1 - 1018
ფანჯარა 1 - 29255
ფანჯარა 1 - 11032
ფანჯარა 1 - 18808
ფანჯარა 1 - 29026
314
ფანჯარა 1 - 587
ფანჯარა 1 - 15063
ფანჯარა 1 - 1567
ფანჯარა 1 - 3759
^C
achiko@debian:∼$
:
0 bash 1 bash
ა ზე
მიმდინარე რეგიონის (დანაყოფის) დახურვა Ctrl^a + X -ით ხდება. დამატებითი
სტ
ინსტრუქციების სანახავად შეგიძლიათ Ctrl^a + ? კლავიშების კომბინაციით დახმარებას
მიმართოთ.
ა!
ო
სი
ფ
Screen key bindings, page 1 of 2.
ge
.
Command key: ^A Literal ^A: a
ელ
ვე
u.
break ^B b license , removebuf =
clear C lockscreen ^X x reset Z
ო
ed
თ
colon : log H screen ^C c
შა
u.
ერ
detach ^D d meta a silence _
მუ
bt
displays * next ^@ ^N sp n suspend ^Z z
მწ
სა
sh
ra
შვ
liz
შე
e
il.
ვთ
ch
ar
315
17.4.2 Tmux
tmux მულტიპლექსერი GNU screen-თან შედარებით ახლი პროგრამაა. მას მეტი შესაძ-
ლებლობა აქვს, თუმცა ეს უპირატესობა მნიშვნელოვან ფუნქციებს არ ეხება. ორივე პროგრამა
კარგად ართმევს თავს მათზე დაკისრებულ ამოცანებს. შესაბამისად, ჯერჯერობით, ერთის მე-
ორისგან უპირატესად გამორჩევა სუბიექტურია გამოყენების თვალსაზრისით. მომხმარებელს
ის პროგრამა ურჩევნია, რომელსაც იცნობს და ფლობს.
:
მოდით, მოკლედ მიმოვიხილოთ tmux მულტიპლექსერი. ნაგულისხმევი მნიშვნელო-
ზე
ბით, არც ისაა დაყენებული Debian სისტემებში. tmux-ის გამოსაყენებლად, GNU screen-ის
მსგავსად, მისი ხელით დაყენება მოგიწევთ (apt-get install tmux).
ა
გავუშვათ tmux ბრძანება და ვნახოთ, თუ როგორ გამოიყურება ეს მულტიპლექსერი.
სტ
ა!
ო
achiko@debian:∼$
სი
ფ
რ
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
vi
sh
ra
ეს
შვ
თება
liz
შე
მასზე მიერთება
il.
შე
ch
ar
316
ოპერაცია tmux screen
:
შემდეგ ფანჯარაზე გადასვლა Ctrl^b + n Ctrl^a + n
ზე
წინა ფანჯარაზე გადასვლა Ctrl^b + p Ctrl^a + p
ა
გახსნილი ფანჯრების ნუსხა Ctrl^b + w Ctrl^a + w
სტ
მიმდინარე ფანჯრის დახურვა Ctrl^b + & Ctrl^a + k
ა!
ო
ფანჯრის ჰორიზონატალურად დაყოფა Ctrl^b + " Ctrl^a + S
სი
ფ
ფანჯრის ვერტიკალურად დაყოფა Ctrl^b + % Ctrl^a + |
ge
ფანჯრის დანაყოფებზე გადასვლა. Ctrl^b + ← , ↓ , ↑ , → Ctrl^a + tab
.
ელ
screen-ში დანაყოფს რეგიონი ჰქვია,
ვე
u.
tmux-ში პანელი
მიმდინარე დანაყოფების დახურვა Ctrl^b + x Ctrl^a + X
ო
ed
თ
შა
u.
ერ
რად) და თითოეულ მათგანში შელის სხვადასხვა სახალისო ბრძანება გავუშვათ (figlet,
მუ
toilet, cmatrix, fortune, cowsay, sl ან სხვა). ყოველი მათგანი ხელით არის დასაყენებე-
bt
ლი. მსგავსს სურათს მივიღებთ:
მწ
სა
li@
მო
achiko@debian:∼$ cmatrix
ის
p i v 3 \ k \ s L V a d s t ( q 7 9 J & n H
vi
2 & e 0 A ) n C | j n k w [ K X H f o r l { N I
ბი
არ
sh
v ) 5 | & L i b $ L y W \ g | D g 8 u R b s 2 A ;
$ ( i A ( ] [ R 1 > [ E t u G @ E ( [ < T @ P
ნე
ra
H d V . g O V r { J f @ e 0 } p v \ x S ; X { `
ეს
შვ
B q X A ; " c 5 z ` ? Q K h P H H " G ] v ` C $ @
ba
7 ( Q 8 S R _ E N 1 q M g : ( 0 # w # _ T b E
ნი
R Y g N # [ _ H u > g l < , \ | l \ n = E n
liz
T 0 j y ^ t 4 M P z y , ^ p ! p = H j > | , f
შე
Y Z ] < ? i 3 j Y S Z 6 n # - l T
v 5 6 d 4 ;
e
> " : e I | l 1 v b M k f L V m 8
% ; S j { x
il.
/ 8 W Q F 5 l = , 4 I W ) { " & T
- i i - G r
ვთ
Z n : Y w & < h 7 P v m O , 3 w j
. E Y 3 P i
ch
f 0 p * l < G _ j O 6 W / P u g
e ] n U t [
ხო
Y 5 K { , _ F g - f ] o i ( _ R
| X b K ? i
ar
{ 0 q T q ^ t 0 B % ( r k q ! ] j ; } h _ F b
P r ' @ ! ? G P 0 p M S B q J p l ( s / N
გთ
g \ ( A r Z s r Q m / / 3 } " ` ' H A [
` y v & h * . G f B Z d H N - H F i Z
U O ^ ) U O G P H 8 e \ . J E / 5 i $ x
H U y w H I " O g m @ s J J & _ x U D
317
achiko@debian:∼$ figlet Mishka achiko@debian:∼$ fortune | cowsay
__ __ _ _ _ ___________________________________
| \/ (_) ___| |__ | | ____ _ / The ripest fruit falls first. \
| |\/| | |/ __| '_ \| |/ / _` | | |
| | | | | (__| | | | < (_| | \ -William Shakespeare,"Richard II" /
|_| |_|_|\___|_| |_|_|\_\__,_| -----------------------------------
\ ^__^
:
ზე
\ (oo)\_______
(__)\ )\/\
ა
||----w |
სტ
|| ||
ა!
[0] 0:bash* "mypc" 17:25 21-Aug-19
ო
სი
ფ
მულტიპლექსერების ერთ-ერთ მთავარ დანიშნულებას, მუდმივი სესიებისა და მრავალ-
ge
ფანჯრული სისტემის უზრუნველყოფის გარდა, წარმოადგენს სესიების გაზიარება მრავალ მომ-
.
ელ
ხმარებელს შორის. ეს შესაძლებლობა მომხმარებლებს თანამშრომლობით მუშაობაში ეხმარე-
ბა. ვე
u.
ვნახოთ, როგორ ხდება სესიის გაზიარება tmux-ის მაგალითზე. ამისთვის გახსნილი უნ-
ო
ed
თ
და გვქონდეს მინიმუმ ორი სხვადასხვა ტერმინალი, საიდანაც გაზიარებულ სესიას მივუერთდე-
ბით. სიმარტივისთვის ვიგულისხმოთ, რომ ორივე ტერმინალში ერთი მომხმარებელია შესული.
შა
u.
შევქმნათ პირველ ტერმინალში tmux-ის ახალი სესია public დასახელებით და მივუერთდეთ მას
ერ
შემდეგი ბრძანებით:
მუ
bt
მწ
სა
sh
ra
ეს
სულ ეს არის. ახლა, რაც ერთ ტერმინალში მოხდება მეორეშიც გამოჩნდება და პირი-
შვ
იქნება შესაძლებელი.
ნი
liz
ტერმინალი 1 ტერმინალი 2
შე
$ $
$ echo "ტ1-დან შეყვანილი ტექსტი" $ echo "ტ1-დან შეყვანილი ტექსტი"
ch
$ $
ar
318
ახლა განვიხილოთ შემთხვება, როდესაც სესიის გაზიარება ორ სხვადასხვა მომხმა-
რებელს შორის ხდება. ამისთვის tmux-ის პროცესისთვის უნდა არსებობდეს ისეთი სოკეტი5 ,
რომელშიც ორივე მომხმარებელს ექნება კითხვისა და ჩაწერის უფლება. ამავდროულად, აუცი-
ლებელია, ეს მომხმარებლები ერთსა და იმავე ჯგუფში იყვნენ გაწევრიანებული.
:
achiko მომხმარებლი არის შესული, ხოლო მეორეში mishka მომხმარებლი. achiko-ც და
ზე
mishka-ც joint პირველადი ჯგუფის წევრები არიან.
ა
სტ
შევქმნათ პირველ ტერმინალში tmux-ის ახალი სესია public დასახელებით, რომელიც
იყენებს /tmp/S სოკეტს:
ა!
ო
სი
ფ
achiko@debian:∼$ tmux -S /tmp/S new -s public
ge
.
დავრწმუნდეთ, რომ ამ სოკეტის ფაილის მფლობელი ჯგუფი არის joint.
ელ
ვე
u.
achiko@debian:∼$ ls -l /tmp/S
ო
ed
თ
srwxrwx--- 1 achiko joint 0 Sep 6 17:08 /tmp/S
შა
u.
ერ
წინააღმდეგ შემთხვევაში აუცილებელი იქნება ქვემოთ მოცემული ბრძანებით ამ სოკე-
მუ
ტის ფაილის მფლობელ ჯგუფად გამოვაცხადოთ joint, რათა ამ ჯგუფის წევრ მომხმარებლებს
bt
მასში ჩაწერისა და მისი წაკითხვის უფლება ჰქონდეთ.
მწ
სა
li@
მო
vi
ბი
sh
დებით.
ra
ეს
შვ
liz
შე
ყურადღება მიაქციეთ იმას, რომ თუ joint ჯგუფში სხვა მომხმარებლებიც არიან გაწევ-
რიანებულნი, მათაც ექნებათ გაზიარებულ სესიასთან წვდომა.
ch
ხო
ar
გთ
5
Unix-ის სოკეტი არის პროცესებს შორის კომუნიკაციის მექანიზმი, რომლის წყალობითაც ხდება მათ შორის მონა-
ცემების გაცვლა. შელში Unix-ის სოკეტი s ტიპის ფაილით არის წარმოდგენილი. Unix-ის სოკეტის გარდა არსებობს IP
სოკეტიც, რომელიც ქსელურ პროცესებს შორის კომუნიკაციისთვის არის საჭირო.
319
ტერმინალი 1 ტერმინალი 2
$ whoami $ whoami
achiko mishka
$ groups $ groups
joint joint
$ tmux -S /tmp/S new -s public $ tmux -S /tmp/S attach -t public
:
ზე
$ $
# chgrp joint /tmp/S # chgrp joint /tmp/S
ა
$ $
სტ
$ echo "ტ1-დან შეყვანილი ტექსტი" $ echo "ტ1-დან შეყვანილი ტექსტი"
ტ1-დან შეყვანილი ტექსტი ტ1-დან შეყვანილი ტექსტი
ა!
$ $
ო
$ echo "ტ2-დან შეყვანილი ტექსტი" $ echo "ტ2-დან შეყვანილი ტექსტი"
სი
ფ
ტ2-დან შეყვანილი ტექსტი ტ2-დან შეყვანილი ტექსტი
$ $
ge
.
ელ
ვე
u.
[public] <h* "mypc"18:11 21-Aug-19 [public] <h* "mypc"18:11 21-Aug-19
ო
ed
თ
ამას გარდა, mishka მომხამრებელს შეუძლია achiko-ს გაზიარებულ სესიას მხოლოდ
შა
ე
დათვალიერების რეჟიმში შეუერთდეს, ისე, რომ ცვლილების გაკეთება არ შეეძლოს. ამისთვის
u.
ერ
მან -r ოფცია უნდა გამოიყენოს მიერთებისას, შემდეგნაირად (თუმცა, ეს მხოლოდ mishka
მუ
მომხმარებლის გადასაწყვეტია):
bt
მწ
სა
li@
achiko@debian:∼$ tmux -S /tmp/S attach -t public -r
მო
ის
vi
sh
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
320
თავი 18
:
ა ზე
მასივები
სტ
ა!
ო
სი
ფ
ასივი წარმოადგენს ცვლადს, რომელიც მრავალ მნიშვნელობას შეიძლება შეიცავდეს.
მ
რ
ge
.
შესაძლებელია ნებისმიერი ცვლადი გამოვიყენოთ როგორც მასივი. მისი სიგრძე არ არის
ელ
შემოსაზღვრული, რაც იმას ნიშნავს, რომ მასივში ნებისმიერი რაოდენობის ელემენტების
ვე
u.
ჩაწერა შეგვიძლია. მათი იდენტიფიკაციისთვის ელემენტების ინდექსის ნომრები გამოი-
ყენება. ინდექსი დადებით მთელ რიცხვს წარმოადგენს და მისი ათვლა 0-დან იწყება. თუმცა,
ო
ed
თ
აუცილებელი არაა მასივის ელემენტების ინდექსების თანმიმდევრობით გამოყენება.
შა
ე
მასივის შექმნა, მასივის გამოცხადება (ამ ტერმინს ხშირად იყენებენ მასივებთან მი-
u.
ერ
მართებაში) declare ბრძანებით არის შესაძლებელი, შემდეგნაირად:
მუ
bt
მწ
li@
მო
რად შეგვიძლია:
vi
ბი
არ
sh
ra
ეს
ba
liz
ch
achiko@debian:∼$ ARRAYNAME[indexnumber]=value
ხო
ar
321
მოდით, მოვიყვანოთ მასივის ელემენტების დამუშავების მაგალითები. ნიმუშისთვის
შემდეგი მასივი შევქმნათ:
:
ზე
ა) მასივის ყველა ელემენტის გამოტანა:
ა
სტ
achiko@debian:∼$ echo ${Linux[*]}
Debian Ubuntu Red hat Arch Linux Mint
ა!
ო
achiko@debian:∼$ echo ${Linux[@]}
Debian Ubuntu Red hat Arch Linux Mint
სი
ფ
რ
ge
.
ბ) მასივის ელემენტების რაოდენობა:
ელ
ვე
u.
achiko@debian:∼$ echo ${#Linux[*]}
ო
5
ed
თ
შა
u.
გ) მასივის მე-4 ელემენტის გამოტანა:
ერ
მუ
bt
achiko@debian:∼$ echo ${Linux[3]}
მწ
სა
li@
Arch Linux
მო
ის
sh
შვ
liz
ch
ხო
322
თ) მასივის მე-4 ელემენტზე სხვა მნიშვნელობის მინიჭება:
achiko@debian:∼$ Linux[3]="Suse"
Arch
achiko@debian:∼$ echo ${Linux[*]}
Debian Ubuntu Red hat Suse Mint
:
ზე
ი) მასივის პირველი ელემენტის სიგრძე:
ა
სტ
achiko@debian:∼$ echo ${#Linux[0]}
6
ა!
ო
სი
ფ
კ) მასივის მეორე ელემენტის გამოტანისას (მხოლოდ გამოტანისას! ეს ელემენტი უცვლელი
რჩება) პირველი შემხვედრი სიტყვა u -ს ჩანაცვლება TEST სიტყვით:
ge
” ”
.
ელ
achiko@debian:∼$ echo ${Linux[1]/u/TEST} ვე
u.
UbTESTntu
ო
ed
თ
შა
u.
TEST სიტყვით:
ერ
”
მუ
bt
მწ
li@
UbTESTntTEST
მო
ის
”
TEST სიტყვით თუ ეს ელემენტი u -თი იწყება:
ბი
” ”
არ
sh
ნე
Ubuntu
შვ
ba
”
TEST სიტყვით თუ ეს ელემენტი u -თი მთავრდება:
liz
” ”
შე
UbuntTEST
ვთ
ch
ო) მასივის პირველი ელემენტის გამოტანისას მისი პირველი დიდი ასო-ნიშნის (თუ ასეთი
ხო
323
achiko@debian:∼$ echo ${Linux[0]^^}
DEBIAN
:
ზე
achiko@debian:∼$ echo ${Linux[0]∼}
DEBIAN
ა
სტ
რ) მასივის პირველი ელემენტის გამოტანისას მისი ყველა ასო-ნიშნის გადანაცვლება ანუ
ა!
დიდი ასო-ნიშნების პატარით შეცვლა, ან პატარა ასო-ნიშნების დიდით შეცვლა:
ო
სი
ფ
achiko@debian:∼$ echo ${Linux[0]∼∼}
ge
DEBIAN
.
ელ
ვე
u.
ს) მასივის ელემენტების ინდექსის ნომრების გამოტანა:
ო
ed
თ
achiko@debian:∼$ echo ${!Linux[*]}
შა
0 1 2 3 4 ე
u.
ერ
მუ
bt
ტ) მასივში ელემენტების დამატება:
მწ
სა
li@
მო
sh
ra
ეს
შვ
ar
324
achiko@debian:∼$ All=("${Linux[*]}" "${Unixlike[*]}")
achiko@debian:∼$ echo ${All[*]}
Debian Ubuntu Red hat Mint AIX HP-UX OpenBSD
:
ზე
18.1 ასოციაციური მასივი
ა
ინდექსირებული მასივის გარდა, bash-ში ასოციაციური მასივიც არსებობს. თუ ინდექ-
სტ
სირებულ მასივში ელემენტები ინდექსით, რიცხვითი მნიშვნელობით იდენტიფიცირდება, ასო-
ციაციურ მასივში რიცხვითი მნიშვნელობის ნაცვლად, ნებისმიერი სტრინგი შეგვიძლია გამოვი-
ა!
ო
ყენოთ. ასოციაციური მასივის გამოცხადება ასე ხდება:
სი
ფ
achiko@debian:∼$ declare -A ARRAYNAME
ge
.
ელ
ვე
u.
achiko@debian:∼$ ARRAYNAME=([key1]=value1 [key2]=value2 ... [keyN]=valueN)
ო
ed
თ
სადაც პირველი ელემენტის მახასიათებელი სიტყვა (ე.წ. გასაღები) არის key1, მეორე
შა
ე
ელემენტის key2 და ა.შ. ერთიანად შეიძლება ეს მასივი ასე შევქმნათ:
u.
ერ
მუ
bt
$ declare -A ARRAYNAME=([key1]=value1 [key2]=value2 ... [keyN]=valueN)
მწ
სა
li@
მო
ის
sh
ra
შვ
liz
მების სხვა ენებში. ისინი დალაგებული სახით არ იბეჭდება გამოსასვლელზე, რაც წინა მა-
e
ar
325
achiko@debian:∼$ for key in "${!Numbers[@]}"; do echo $key' -
'${Numbers["$key"]}; done | sort
one - ერთი
tree - სამი
two - ორი
:
ზე
ამგვარად, თვითონ გასაღებები დავახარისხეთ ანბანის მიხედვით. შეგვიძლია შედეგი მა-
თი მნიშნვნელობების დახარისხებით ასეთი ჩანაწერით გამოვიტანო:
ა
სტ
achiko@debian:∼$ for key in "${!Numbers[@]}"; do echo $key' -
'${Numbers["$key"]}; done | sort -k3
ა!
ო
one - ერთი
სი
ფ
two - ორი
tree - სამი
ge
.
ელ
ვე
u.
კოდის წერისას შეიძლება გქონდეთ ისეთი შემთხვევა, როდესაც არ გსურთ, შეიცვალოს
მასივის ელემენტების მნიშვნელობა. ასეთ დროს უმჯობესია, მასივის გამოცხადება declare-ის
ო
ed
თ
ნაცვლად readonly ბრძანებით შევასრულოთ. როგორც მისი მნიშვნელობიდან ჩანს, ის უზ-
შა
u.
კითხვით და არა ჩაწერის რეჟიმში. readonly-ით შეგვიძლია როგორც ინდექსირებული, ასევე
ერ
მუ
bt
მწ
სა
achiko@debian:∼$ Linux[2]='CentOS'
ბი
არ
ra
ეს
ba
ბმულზე: https://www.tldp.org/LDP/abs/html/arrays.html
როგორც ზემოთ მოყვანილ მაგალითებში ჩანს strng-ების დასამუშავებლად გამოყენე-
ნი
e
il.
ვთ
ch
ხო
ar
გთ
326
სათაური
:
ზეა
სტ
| |, 51, 221 date, 156 jobs, 89
:, 242 debugger, 236 join, 126
ა!
ო
;, 51 declare, 321
სი
ფ
<, 49 diff, 132 kernel, 12
>, 46 disown, 90 kill, 91
ge
killall, 92
.
>>, 46 Display, 45
ელ
?, 215 du, 136
ვე
less, 27
u.
&&, 51, 221
echo, 96, 143 let, 257
], 217
ო
ed
Linux, 19
თ
ENIAC, 8
ls, 22, 25
შა
ABC, 7 env, 96
ე
u.
ANSI კოდები, 282, 294 environnement, 95
ერ
mkdir, 38
მუ
bt
at, 208 expand, 150
msgcat, 283
მწ
atq, 208
სა
export, 96
li@
MULTICS, 8
atrm, 208 expr, 104
მო
mv, 43
ის
break, 235
sh
fg, 89 nohup, 90
bzip2, 194 FHS, 29
ნე
file, 27
ra
od, 154
ეს
C, 9 find, 133
შვ
fmt, 153
cat, 27, 48 free, 87 paste, 124
ნი
chmod, 76 PID, 81
შე
cp, 42 pwd, 23
cpio, 200 head, 116
cron, 203 HOWTO, 19 read, 227
crontab, 203 readonly, 326
cupname, 304 id, 70 regex, 161
cut, 122 infocmp, 309 regexp, 161
327
renice, 93 unexpand, 150 GPB, 135
return, 271 Unics, 9 KB, 135
uniq, 120 KiB, 135
Screen, 45 Unix, 9 MB, 135
sed, 172 Unix-like, 10 MiB, 135
seq, 259 AIX, 11 PB, 135
set, 97 Android, 11 PiB, 135
:
ზე
SGID, 78 BlackBerry 10, 11 TB, 135
shareware, 13 FreeBSD, 11 TiB, 135
ა
shell, 12, 21 HP-UX, 11 YB, 135
სტ
shift, 266 macOS, 11 YiB, 135
shuf, 261 Minix, 11 ZB, 135
ა!
ო
sort, 118 NetBSD, 11 ZiB, 135
Sparse file, 152 OpenBSD, 11 ინტერპრეტატორი
სი
ფ
split, 142 Solaris, 11 ash, 213
stdin, 45 Tru64, 11 csh, 213
ge
.
unset, 96
ელ
stdout, 45 fish, 213
sterr, 45 uptime, 87
ვე
ksh, 213
u.
Sticky bit, 78 sh, 213
vi/vim, 57
ო
SUID, 78 tcsh, 213
ed
თ
vmstat, 87 zsh, 213
შა
tac, 115
ეკეში, 88
u.
watch, 273
ერ
tail, 116 კოდირება, 129
მუ
wc, 54
bt
tar, 196 კონსოლი, 21
which, 78
მწ
tee, 55 ლიცენზია, 12
სა
whoami, 69
li@
Terminal emulators Affero, 15
მო
სამკომპონენტიანი
ვთ
328
სკრიფტი, 12 HISTFILE, 98 ჰეშირება, 129
ტერმინალი, 21 HISTFILESIZE, 98
შელის ცვლადი, 95 PS1, 98
:
ზეა
სტ
ა!
ო
სი
ფ
რ
ge
.
ელ
ვე
u.
ო
ed
თ
შა
u.
ერ
მუ
bt
მწ
სა
li@
მო
ის
vi
ბი
არ
sh
ნე
ra
ეს
შვ
ba
ნი
liz
შე
e
il.
ვთ
ch
ხო
ar
გთ
329