**Unix shell** — ბრძანებების ინტერპრეტატორი, პროგრამა, რომელიც მომხმარებლის მიერ აკრეფილ ბრძანებას განმარტავს ოპერაციული სისტემისთვის გასაგებ ენაზე და გადასცემს მას შესასრულებლად.

მისი მეშვეობით მომხმარებელს შეუძლია ბირთვთან (ინგლ. kernel) მუშაობა, ბირთვი კი თავის მხრივ, კომპიუტერის პროგრამული მხარის (ინგლ. software) ფიზიკურ მოწყობილობებთან (ინგლ. hardware) დამაკავშირებელი პროგრამაა. მასზე პირდაპირი წვდომის საშუალება, shell-ის გვერდის ავლით, მომხარებელს არ აქვს.

ბრძანებების ნებისმიერი ინტერპრეტატორი მუშაობისას საბოლოო ჯამში იყენებს ერთ მარტივ ალგორითმს:

```
# აჩვენებს მოკლე ტექსტურ გზავნილს ბრძანებათა ხაზის დასაწყისში, რაც ნიშნავს, რომ იგი მზადაა ბრძანების მისაღებად (prompt)
# კითხულობს მომხმარებლის მიერ აკრეფილ მიმდინარე ბრძანებას
# ეშვება მითითებული ბრძანება

```

გრაფიკული და არაგრაფიკული გარემო
--------------------------------

shell-ის გამოყენება შესაძლებელია როგორც არაგრაფიკულ, ასევე გრაფიკულ გარემოში. 

* პირველ შემთხვევაში გამოიყენება ვირტუალური ტერმინალი. მის გასახსნელად საჭიროა ``ctrl`+`alt`+`F1`` კლავიშების კომბინაცია, დასახურად კი ``ctrl`+`alt`+`F2`` ან ``ctrl`+`alt`+`F7`` .

* მეორე შემთხვევაში კი გამოიყენება ტერმინალის ემულატორი, ეს აპლიკაცია გრაფიკულ რეჟიმში მუშაობს shell-თან. როგორც წესი, თავიდანვე დაყენებულია Xterm, Gnome Shell ან Konsole, თუმცა მომხმარებელთა გემოვნებიდან და მოთხოვნებიდან გამომდინარე პოპულარულია guake, Terminator, tilda და სხვ. ისინი განსხვავდებიან დიზაინითა და შესალებლობებით.

ინტერაქტიულობა
--------------

shell-თან შესაძლებელია ინტერაქტიულად მუშაობა, იგი კითხულობს ბრძანებებს სტანდარტული შესასვლელიდან, აბრუნებს შედეგს და ელოდება ახალ ბრძანებას. ასევე თუ Mv , cp, rm და სხვ. ბრძანებებთან -i ( --interactive ) პარამეტრის გამოყენებისას shell სვამს კითხვას, ნამდვილად სურს თუ არა მომხმარებელს ბრძანების შესრულება და მხოლოდ დასტურის მიღების შემთხვევაში განაგრძობს მუშაობას.

```
user ~>> rm -i file.txt 
rm: remove regular empty file 'file.txt'? Yes

```
არაინტერაქტიულ რეჟიმში მუშაობისას კი შესაძლებელია სკირიპტის გამოყენება, რაც არაფერია თუ არა ერთ ფაილში მოქცეული ბრძანებების ერთობლიობა. არაინტერაქტიულობის მაგალითია დირექტორია ***resume.d***-ში არსებული სკრიპტები, რომლებიც ავტომატურად ეშვებიან ოპერაციული სისტემის გამორთვისას და არანაირ გამაფრთხილებელ შეტყობინებას არ აგზავნიან. ამ რეჟიმში გაშვებულია ფონური პროცესებიც, რომლებიც მომხმარებელთა ჩარევას არ საჭიროებენ და არანაირი ინტერაქცია არ აქვთ მათთან.

login shell და non-login shell
------------------------------

მომხმარებლის გარემოს ქმნის გარკვეულ ფაილებში ჩაწერილი მონაცემები, ინტერპრეტატორების მიხედვით მათი დასახელება განსხვავებულია, მაგრამ მსგავსია დანიშნულება. ამ ფაილების დახმარებით თითოეულ მომხმარებელს უნდა შეეძლოს თავისზე მორგებული, კომფორტული გარემოს შექმნა. როცა კონკრეტული მომხმარებელი შედის სისტემაში თავისი სახელითა და პაროლით, იკითხება მისთვის განკუთვნილ ფაილში ჩაწერილი ინსტრუქციები. ისინი განსაზღვრავენ როგორი უნდა იყოს მოსაწვევი ფრაზა, მის მიერ შექმნილ ფაილებზე წვდომის ატრიბუტები (umask) და აშ. 

თუ სისტემაში შესასვლელად გამოყენებულია მომხმარებლის სახელი და პაროლი (**login shell**), მაშინ ინტერაქტიული შელისთვის ***Bourne***-თან თავსებადი ინტერპრეტატორები წაიკითხავენ ***/etc/profile*** და ***~/.profile***.

აქედან *~/.profile*-ში ცლილებების შეტანა მომხმარებელს თავად შეუძლია, რადგან ისაა მისი მფლობელი, ხოლო */etc/profile*-ში კი მხოლოდ root-ს.

```
😜user ~>> ls -l /etc/profile ~/.profile
-rw-r--r-- 1 root root 575 Oct 22 2015 /etc/profile
-rw-r--r-- 1 user user 655 Aug 5 14:11 /home/user/.profile

```
თუ მომხმარებელი, პირობითად user1 შეიყვანს თავის საიდენტიფიკაციო მონაცემებს, მაშინ მის პირად დირექტორიაში განთავსებული */home/user1/.profile* წაიკითხება, ხოლო თუ user2, მაშინ ცხადია */home/user2/.profile*. ფაილების დასახელებები იდენტურია, თუმცა ისინი სხვადასხვა დირექტორიებშია გადანაწილებული და განსხვავებული შიგთავსიც აქვთ, ამიტომაცაა მომხმარებლებისთვის შესაძლებელი ინდივიდუალური გარემოს შექმნა.

ზემოთ განხილულია login shell, მაგრამ თუ იდენტიფიკაციის გარეშე შევდივართ (**non-login shell**) , ვთქვათ გრაფიკულ გარემოში, ცხადია, ასეთი გარემო საერთო გამოყენებისთვის იქნება განკუთვინილი, ამიტომ საჭიროა სხვა ფაილების წაკითხვა, *Bourne*-თან თავსებადი ინტერპრეტატორებისთვის ესენი იქნებიან ***/etc/bashrc*** და ***~/.bashrc.***

ინტერპრეტატორები
----------------

### პირველი shell

1917 წელს კენ ტომპსონმა **Bell Labs**-ში შექნა პირველი ინტერპრეტატორი სახელწოდებით Thompson shell. მას გააჩნდა ისეთი მახასიათებლები, რომლებიც მოგვიანებით საერთო გახდა UNIX-ის მსგავსი ოპერაციული სისტემებისთვის. მათ შორის მილი (pipeline), if და goto, ასევე ფაილების დასახელებებზე არა სრული, არამედ ცალკეული სიმბოლოებით მანიპულირების შესაძლებლობა, მაგალითად 

```
😜 user ~>> touch test_file{1..10}.html.txt
ls test_file*.html.txt
test_file10.html.txt test_file2.html.txt test_file4.html.txt test_file6.html.txt test_file8.html.txt
test_file1.html.txt test_file3.html.txt test_file5.html.txt test_file7.html.txt test_file9.html.txt

```

### Bash

**Bash** — Bourne shell-ის მოდელზე დაფუძნებული დისტრიბუტივია, რომელმაც მისი შესაძლებლობები მნიშვნელოვნად გააუმჯობესა. იგი თავისუფალი პროგრამაა GNU General Public License-ით. 

ბრაიან ფოქსმა ის 1988 წელს პირველად გამოაქვეყნა თავისუფალი პროგრამული უზრუნველყოფის ფონდის (ინგლ. Free Software Foundation) სახელით და მაშინვე ფართო აღიარება მოიპოვა. Bash-ის ბოლო სტაბილური ვერსია 5.0 გამოვიდა 2019 წლის 7 იანვარს.

Bash თავისთავად დაყენებულია UNIX-ის სისტემებზე, განსაკუთრებით ხშირად კი GNU/Linux-ზე, ასევე Mac OS X-ზე. გამოყენებულია Microsoft Windows-ზეც, Cygwin-ის პროექტის ფარგლებში. 

სახელწოდება Bash Bourne-Again shell-ის აბრევიატურაა, ეს სიტყვების თამაშია და ითარგმნება როგორც << ისევ Bourne >>, მაგრამ ინგლისურად წარმოთქმისას ძალიან ჰგავს << born again >> რაც თავიდან დაბადებას, რეინკარნაციას ნიშნავს. 

Bash-ის მიერ შემოთავაზებული გაუმჯობესებული მახასიათებლებია:

1. ბრძანებების ხაზის რედაქტირება
2. ბრძანებების ისტორიის ფაილის შეუზღუდავი ზომა
3. shell-ის ფუნქციები და Alias
4. ინდექსიანი მასივების შეუზღუდავი ზომა
5. ინტეგრალური გამოთვლა ნებისმიერ ბაზაში 2-დან 64-მდე

### სხვა ინტერპრეტატორები

ყველაზე გავლენიანი და გავრცელებული ინტერპრეტატორები არიან C shell და Bourne shell. ისინი გახდნენ მოდელები სხვა მრავალი shell-ისთვის, როგორებიცაა

* Debian Almquist shell (dash)\_ash-ის თანამედროვე ჩანაცვლება Debian-სა და Ubuntu-ში
* Korn shell (ksh) — დეივიდ კორნის მიერ დაწერილი ინტერპრეტატორი Bourne-ის ბაზაზე
* Public domain Korn shell (pdksh)
* MirBSD Korn shell (mksh) — OpenBSD /bin/ksh-ისა და pdksh-ის მემკვიდრე
* Z shell (zsh) — შედარებით ახალი shell , რომელიც არაა თავსებადი bash-თან

ბრძანებების ინტერპრეტატორები, რომლებიც არ ეყრდნობიან C shell-ის და Bourne shell-ის მოდელებს:

* es – A functional programming rc — 90-იანი წლების შუა ხანებში დაწერილი ინტერპრეტატორი
* Friendly interactive shell (fish) – პირველად გამოვიდა 2005 წელს.
* PowerShell – An object-oriented shell.
* A Scheme Shell (scsh)
* wish – A windowing shell for Tcl/Tk.

კონფიგურაციის ფაილები
---------------------

ცხრილში ნაჩვენებია ცნობილი ინტერპრეტატორები და მათი კონფიგურაციის ფაილები.

|  | sh | ksh | csh | tcsh | bash | zsh |
| --- | --- | --- | --- | --- | --- | --- |
| /etc/.login |  |  | login | login |  |  |
| /etc/csh.cshrc |  |  | yes | yes |  |  |
| /etc/csh.login |  |  | login | login |  |  |
| ~/.tcshrc |  |  |  | yes |  |  |
| ~/.cshrc |  |  | yes | yes |  |  |
| ~/etc/ksh.kshrc |  | int. |  |  |  |  |
| /etc/sh.shrc | int. |  |  |  |  |  |
| ~/.kshrc | int. | int. |  |  | int. |  |
| ~/.login |  |  | login | login |  |  |
| ~/.logout |  |  | login | login |  |  |
| /etc/profile | login | login |  |  | login | login |
| ~/.profile | login | login |  |  | login | login |
| ~/.bash\_profile |  |  |  |  | login |  |
| ~/.bash\_login |  |  |  |  | login |  |
| ~/.bash\_logout |  |  |  |  | login |  |
| ~/.bashrc |  |  |  |  | int.+n/login |  |
| /etc/zshenv |  |  |  |  |  | yes |
| /etc/zprofile |  |  |  |  |  | login |
| /etc/zshrc |  |  |  |  |  | int. |
| /etc/zlogin |  |  |  |  |  | login |
| /etc/zlogout |  |  |  |  |  | login |
| ~/.zshenv |  |  |  |  |  | yes |
| ~/.zprofile |  |  |  |  |  | login |
| ~/.zshrc |  |  |  |  |  | int. |
| ~/.zlogin |  |  |  |  |  | login |

განმარტება:

* ცარიელი უჯრა ნიშნავს, რომ ინტერპრეტატორი არ კითხულობს მითითებულ ფაილს
* yes — ფაილი ყოველთვის წაიკითხება ინტერპრეტატორის მიერ
* login — ფაილი წაიკითხება თუ ინტერპრეტატორია login shell
* n/login — ფაილი წაიკითხება თუ ინტერპრეტატორია non-login shell
* int. — ფაილი წაიკითხება თუ ინტერპრეტატორი ინტერაქტიულია

სქოლიო
------

1. ↑  Terminal emulator
2. ↑  "The Unix Shell" Bourne, Stephen R. (October 1983)
3. ↑  "Introduction to the Unix Shell history" Nikolai Bezroukov (2015-08-13)
4. ↑  "Bourne shell, or sh" *Interview with Steve Bourne*
5. ↑  "FreeBSD Ports: Shells" დაარქივებული 2019-12-22 საიტზე Wayback Machine.  Freebsd.org. 2014-03-30
6. ↑  Harley Hahn's Guide to Unix and Linux დაარქივებული 2019-08-24 საიტზე Wayback Machine.  Harley Hahn
7. ↑  Shell Command Language