Bash Shell-ə giriş
Bash Shell-ə giriş
GNU Linux-un müxtəlif versiyaları olduğu kimi, shell-lər də müxtəlif növlərə malikdir və uyğunluq baxımından fərqlənir. CentOS-da standart shell Bash və ya Bourne Again Shell olaraq bilinir. Bash shell, Stephen Bourne tərəfindən hazırlanmış Bourne Shell-in müasir, təkmilləşdirilmiş versiyasıdır. Bash, Ken Thompson və Dennis Ritchie tərəfindən Bell Labs-da yaradılmış Unix əməliyyat sistemindəki orijinal Thompson Shell-in birbaşa əvəzləyicisi idi (Stephen Bourne də Bell Labs-da işləyirdi).
Hər kəsin sevdiyi bir shell var və hər birinin öz güclü və zəif tərəfləri var. Ancaq əksər hallarda, Bash bütün Linux dağıtımlarında standart shell olacaq və ən çox istifadə olunan olacaq. Təcrübə qazandıqdan sonra hər kəs özünə uyğun olan shell-i araşdırmaq və istifadə etmək istəyəcək. Lakin eyni zamanda, hər kəs Bash shell-də ustalaşmaq istəyəcək.
Digər Linux shell-lərinə Tcsh, Csh, Ksh, Zsh və Fish daxildir.
Hər hansı bir Linux shell-i ekspert səviyyəsində istifadə etmək bacarıqlarının inkişaf etdirilməsi CentOS administratoru üçün son dərəcə vacibdir. Əvvəllər qeyd etdiyimiz kimi, Linux Windows-dan fərqli olaraq, əsasən komanda xətti ilə işləyən əməliyyat sistemidir. Shell sadəcə administratora (və ya istifadəçiyə) əməliyyat sisteminə komanda vermək imkanı verən bir istifadəçi interfeysidir. Əgər Linux sistem administratoru bir təyyarə pilotu olsaydı, shell-dən istifadə etmək təyyarəni avtomatik rejimdən çıxarıb əl ilə idarə etmək kimi olardı.
Bash kimi Linux shell-ləri Kompüter Elmlərində Komanda Xətti İnterpreteri olaraq bilinir. Microsoft Windows-un da DOS (orijinal DOS əməliyyat sistemi ilə qarışdırılmamalıdır) və PowerShell adlı iki komanda xətti interpreteri var.
Bash kimi müasir shell-lərin əksəriyyəti, həm adi, həm də mürəkkəb tapşırıqları avtomatlaşdırmaq üçün daha mürəkkəb shell skriptlərinin yaradılmasına imkan verən konstruksiyaları təmin edir.
Konstruksiyalara daxildir
– Skriptin idarəetməsi (ifthen və else)
– Məntiqi müqayisə əməliyyatları (böyükdür, kiçikdir, bərabərlik)
– Dövrlər
– Dəyişənlər
– Əməliyyatı təyin edən parametrlər (əmrlərdəki açarlara bənzər)
Shell skriptindən istifadə ilə skript dili arasındakı fərqlər
Administratorlar bir tapşırığı yerinə yetirməyi düşündükləri zaman tez-tez özlərinə sual verirlər: Shell skriptindən istifadə etməliyəm, yoxsa Perl, Ruby və ya Python kimi bir skript dilindən?
Bu mövzuda müəyyən bir qayda yoxdur. Sadəcə shell-lərlə skript dilləri arasında bəzi tipik fərqlər var.
Shell
Shell, sed, grep, tee, cat kimi Linux komandalardan və Linux distrolardakı digər terminal əsaslı utilitlərdən istifadə etməyə imkan verir. Əslində, demək olar ki, hər hansı bir komanda xətti Linux utiliti sizin shell-də skriptlənə bilər.
Shell-dən istifadə üçün əla bir nümunə, hostların siyahısını DNS həlli üçün sürətli bir skript vasitəsilə yoxlamaq ola bilər.
DNS adlarını yoxlamaq üçün sadə Bash skriptimiz −
#!/bin/bash for name in $(cat $1); do host $name.$2 | grep "has address" done exit
DNS həlli üçün test etmək məqsədilə kiçik söz siyahısı
dns www test dev mail rdp remote
google.com domeninə qarşı çıxış (nəticə) −
[rdc@centos ~]$ ./dns-check.sh dns-names.txt google.com -doing dns dns.google.com has address 172.217.6.46 -doing www www.google.com has address 172.217.6.36 -doing test -doing dev -doing mail googlemail.l.google.com has address 172.217.6.37 -doing rdp -doing remote [rdc@centos ~]$
Sadə Linux komandalarından istifadə edərək, söz siyahısından DNS adlarını yoxlamaq üçün 5 sətirlik sadə bir skript hazırladıq. Hətta yaxşı bir şəkildə tətbiq edilmiş DNS Kitabxanasından istifadə edildikdə belə, bunu Perl, Python və ya Ruby-də həyata keçirmək xeyli vaxt aparardı.
Skript Dili
Skript dili shell-dən kənarda daha çox nəzarət imkanı verir. Yuxarıda göstərilən Bash skripti Linux host əmrinin ətrafında bir qabıq istifadə edirdi. Bəs daha çox şey etmək və shell-dən kənarda qarşılıqlı əlaqə qurmaq üçün öz proqramımızı, məsələn, host kimi bir tətbiq yaratmaq istəsək nə edərik? Bu halda skript dilindən istifadə edərdik.
Bundan əlavə, yüksək səviyyədə dəstəklənən bir skript dili ilə əksər hallarda hərəkətlərimizin fərqli sistemlərdə işləyəcəyinə əmin ola bilərik. Məsələn, Python 3.5, eyni kitabxanalar quraşdırılmış halda, Python 3.5 işləyən hər hansı digər sistemdə də işləyəcək. Amma BASH skriptimizi həm Linux, həm də HP-UX-də işlətmək istəsək, bu belə olmayacaq.
Bəzən skript dili ilə güclü bir shell arasındakı sərhədlər bulanıq olur. CentOS Linux administrasiya tapşırıqlarını Python, Perl və ya Ruby ilə avtomatlaşdırmaq mümkündür. Bu, olduqca adi bir haldır. Eyni zamanda, təcrübəli shell-skript tərtibatçıları Bash-da sadə, lakin funksional bir veb-server daemonu hazırlayıblar.
Skript dillərində və shell-lərdə tapşırıqları avtomatlaşdırmaqda təcrübə qazandıqdan sonra, CentOS administratoru problemi həll etməyə başlayarkən haradan başlamaq lazım olduğunu tez bir zamanda müəyyən edə biləcək. Layihəyə əvvəlcə shell skripti ilə başlamaq çox yaygındır. Sonra layihə daha mürəkkəbləşdikcə, skript (və ya kompilyasiya olunmuş) dilə keçmək olar.
Layihənin müxtəlif hissələri üçün həm skript dilindən, həm də shell skriptindən istifadə etmək də tamamilə düzgündür. Məsələn, bir saytı skrap etmək üçün Perl skriptindən istifadə edə bilərsiniz. Sonra, shell skriptindən istifadə edərək sed, awk və egrep ilə məlumatları ayırmaq və formatlaşdırmaq olar. Nəhayət, formatlaşdırılmış məlumatları MySQL verilənlər bazasına daxil etmək üçün veb GUI vasitəsilə PHP skriptindən istifadə edə bilərsiniz.
Shell-lər haqqında bəzi nəzəriyyələrə sahib olduğumuza görə, CentOS-da Bash shell-dən tapşırıqları avtomatlaşdırmaq üçün əsas tikinti bloklarına başlayaq.
Giriş, Çıxış və Yönləndirmə
stdout-u digər əmrlə emal etmək −
[rdc@centos ~]$ cat ~/output.txt | wc -l 6039 [rdc@centos ~]$
Bunu birinci dərsdə yönləndirmə və ya yönləndirməni təyin etmə barədə çox danışmadan tanıtmışdıq. Linux-da bir terminal açdığınızda, shell-iniz aşağıdakılar üçün standart hədəf kimi görünür −
- standard input < 0
- standard output > 1
- standard error 2
Gəlin bunun necə işlədiyinə baxaq
[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2 COMMAND PID USER **FD** TYPE DEVICE SIZE/OFF NODE NAME bash 13684 rdc **0u** CHR 136,0 0t0 3 /dev/pts/0 bash 13684 rdc **1u** CHR 136,0 0t0 3 /dev/pts/0 bash 13684 rdc **2u** CHR 136,0 0t0 3 /dev/pts/0 [rdc@centos ~]$
**/dev/pts/0** bizim pseudo terminalımızdır. CentOS Linux buna baxır və açıq terminal tətbiqimizi real bir terminal kimi, klaviatura və ekranın seri interfeys vasitəsilə qoşulmuş olduğunu düşünür. Lakin, bir hypervisor-un hardware-i əməliyyat sisteminə abstrah etməsi kimi, **/dev/pts** də terminalımızı tətbiqlərə abstrah edir.
Yuxarıdakı **lsof** əmrindən görürük ki, **FD** sütununda bütün üç fayl təsvirçisi (0, 1, 2) virtual terminalımıza təyin edilib. İndi əmrləri göndərə, əmr çıxışını görə və eləcə də əmrlə bağlı hər hansı bir səhvi izləyə bilərik.