Sistem Programlama Türkçe Kaynak (KTÜ)
modern bir işletim sistemi;
iki ana gelişim kolu vardır. Two main threads of development:
Bir Unix makinesine giriş yapmak o sistem için bir hesap gerektirir. Bir kullanıcı hesabı giriş ve şifre ile ilişkilendirilmiştir. “login” kullanıcı adınızdır, şifreniz siz yazarken gösterilmez.(login shell kullanıcıya hizmet veren ilk shell'dir)
Terminal bağlantısını il karşılayan süreç init sürecidir.Super user ıd'si ile koşar.Bu init süreci fork() sistem çağrısı ile süreç oluşturur süreç kendisini iki parçaya böler(parent,child). Sonra kullanıcıdan username girmesini ister username aldıktan sonra login, username için tanımlanmış şifreyi okur ama bu şifre de şifrelenmiştir bu yüzden girilenide şifreler ve karşılaştırır.Encryted halini okur ve karşılaştırır doğrulama yaptıkdan sonra home dizinine setlenir UID=100 ise UID=110 olur kullanıcıya verilecek hizmet hangisi ise ,hangi shell ise login shell icraya başlar kullanıcının çalışma ortamları açılır.
Sadece giriş yaptığınızda bir Unix programı çalıştırılabilir. Bir komut yorumlayıcısıdır. - UNIX yardımcı programlarına temel kullanıcı arabirimini sağlar. Bir programlama dilidir. -kabuk komutlarından oluşan program kabuk komut dosyası olarak adlandırılır. Komutları bir dosyaya koyabilir ve çalıştırabilirsiniz
Giriş yaptıktan sonra, sistemle ilgili bazı bilgiler görüntülenecek ve ardından komutların girilebileceği bir kabuk istemi görüntülenecektir. Komut satırında yazdıklarımızı bir dosya içerisine yazarak hepsini icra edebiliriz bu dosya scriptfile dosyası olmuş olur. Dosya içersine yazdığımız kodların hangi bash'in koşacağını belirtmek gerekir.(ilk satırda)Buradaki syntax hangi shell'e göre yazılmıssa ona göre icra edilir.Size hizmet veren Shell ile script'in sytanx'ı aynıysa belirtmeye gerek yoktur. Dosyanın hangi shell ile koşacağını belirtmek için;
#!:Bir script dosyasının ilk satırı bu iki karakterle başlamalıdır. Shebang olarak ifade edilen bu karakterlerden hemen sonra, boşluk bırakmadan hangi bash programı kullanılacaksa o programın mutlak adresi yazılır.
/bin/bash: Burada belirtilmesi gereken diğer bir konu da sisteminizde hangi bash yazılımını kullandığınızdır. which bash komutunun sonucu size mutlak adresi söyleyecektir. #! ifadesinden sonra herhangi bir bash adresi yazmasanız da Script çalışabilir. Fakat sizin yazdığınız Script başka bir sistemde çalıştırılmak istendiğinde hata verme ihtimali vardır. Bu sebeple bash adresini yazmayı alışkanlık haline getirmek daha sağlıklı olacaktır.
Bu satırları Bash yorum olarak farz edecek ve işleme almayacaktır. Dosyanın sahibi, oluşturulma tarihi ve oluşturulma maksadı vb. bilgilere burada yer verebilirsiniz.(not: bash=>komut dili yorumlayıcısı)
shell(kabuk), Unix sistemine komut göndermek için kullandığınız programdır. Bazı komutlar tek bir kelimedir.örneğin;
Bu komutla o anki kullancı detaylarını görebiliriz. aynı şekilde whoami komutu ile o anki kullanıcının adını görebiliriz w komutu ilede login olmuş kullanıcıları görebiliriz.
Bu komutla terminal ekranında sistem tarih ve saat bilgilerini görebiliriz.
bulunduğumuz directory(dizin)'deki dosyaları listeler
argümanlarla komuş işlemini değiştirebiliyoruz, daha detaylı listeleme gibi örneğin;
ls -l komutu ile dosların ve dizinlerin çok daha detaylı(izinler,kullanıcı ve grup bilgileri, oluşturulma tarihi vb.) halini liste şeklinde görebiliriz. ls -a komutu gizli dosya ve dizinleri görebiliriz. ls -la veya ls -al komutuylada ls -l ve ls -a komutlarını beraber kullanabiliriz. ls -a;ls -l şeklinde de iki komut calıştırılabilir. ls bin komutuda bin klasöründekileri listeler ls textfile1 textfile2 yazarsakta bu dosyaları listeler.
Bir komut satırında komut icra ettiğinzde sistem komutu veya programı ise; shell fork() ile iki süreçe ayrılır(parent ve child), child süreç exec() ile komutu icra eder bu sırada parent süreci bekler ve arka planda komut yürütülürse devam eder. shell kendi parça komutu ise herhangi bir child süreç oluşturmadan icra eder.(cd,export,echo... kendi komutlarını kendi icra eder yeni bir süreç oluşturmaz.
Komut satırı tepki vermiyorsa bir işlemi icra ediyor ve bir problem olmuş olabilir.
kesme gönderir, süreci keser.
sürecin icrasını durdurur.
ps komutu sistem üzerinde çalışan süreçleri görebilmenizi sağlar. Bunların arasından süreç kontrolü, süreç sorumlusu, süreç numarası, çalıştırılan komut, zaman, cpu, bellek gibi birçok bilgi görebilirsiniz.
bg komutu: Bu komut bütün Linux dağıtımlarında mevcut olmayabilir. Ancak genel görevi sistemde durmuş olan bir görevi yada processi arka planda devam ettirir.Bunun dışında sistem üzerinde şuanda koşmakta olan görevleri listeler.
fg komutu: Bu komut sistem üzerinde durmakta olan bir süreci yada görevi ön plana çekerek koşmasını sağlar. Her Shell kabuğu bu komutu koşmaz.
terminali kapatır(logout).
Dosya sistemi, makinenizdeki fiziksel depolama(diskler) , diğer makinelerdeki depolama (NFS), giriş/çıkış cihazları ve benzeri durumlar için sizin arayüzünüzdür. Unix'de herşey bir dosyadır.(porgramlar, text dosyaları, çevre birimleri, terminaller...) Dizinler diğer dosyaları içeren(referanslara) bir dosyadır. Unix'de sürücü harfleri yoktur.Dosya sistemi, depolama aygıtlarına mantıksal bir görünüm sağlar.
Çalışma dizini: dosya sisteminin geçerli konumu yani sistemdeki konumunuz.
pwd (print working directory) komutu çalışma dizininizin mutlak yolunu (daha sonra) verir. Başka bir dizin belirtmediğiniz sürece, bir komut çalışma dizini içerisinde çalışmak istediğinizi varsayar.
Ana dizin: kişisel kullanıcı alanı. Oturum açıldığında, çalışma dizininiz ana dizininize ayarlanacaktır. Ana dizininize giden yol, ~ (tilde) sembolüyle belirtilebilir. Kullanıcı1'in ana dizini ~ kullanıcı1 şeklinde belirtilebilir. Başka bir dizindeysek cd ~/ komutunu vererek ana dizine gidebiliriz.
Kök dizini(Root directory) : / , bütün dosyalar root'a bağlanır. Dizinler düz dosyalar veya başka dizinler içerebilir. Sonuç, dosya sistemi bir ağaç yapısıdır. Unix, herhangi özel bir dosya adı uzantısını tanımıyor.
Dizinler / ile ayrılır. Absolute path(tam yol): Root(kök)'dan başlayarak ağacın takip edildiği yoldur.Örneğin: /home/user1/textfile ~user1/textfile ~/textfile Absolute path kullanıcı dizini referans alınarak bildirim yapar.
Relative path(göreceli yol): çalışma dizininden başlar.
textfile bil318/lec1.txt çalışma dizinini referans alma : ./../textfile parent'ı referans alma : ../textfile
Bu dizinler / yani root altındadır. / bin - standart komutlar ve yardımcı programlar; yürütülebilir.Kullanıcının koşabildiği tüm programlar bu dizindedir. / sbin - root tarafından icra edilebilen programlar, sistem komutları ve yardımcı programları (önyükleme için gerekli) bulunur / dev - blok ve karakter aygıtı dizini.Dosya linleri yazıcı,cdrom sürücü tanımlamaları bu dizin altındadır.Terminale tty komutunu verirsek bizim kullandığımız terminal device numarasını verir / etc - ana bilgisayara özgü yapılandırma; host hizmetleri / home - kullanıcıların ana dizinleri.Kullanıcının login ismiyle dizinler açılır (home/hakan) / lib - çeşitli diller için kütüphane dizini.(.so unix dosyaları , .dll windows dosyaları) / tmp - geçici dosyalar.(veritabanında taplo update ,update set işlemlerinde tmp kullanılır) / usr - kullanıcı yardımcı programları ve uygulamaları; / Usr / local /. Kurulumda değil daha sonra sisteme dahil olan programlardır olsada olur olmasada. / var - çeşitli log işlemleri,değişken olan sistem dosyaları için bu dizin kullanılır (günlükler, makaralar, e-posta)
Çalışma dizinini değiştirmek için kullanılır. cd <dizin yolu> şeklinde kullanılır. Absolute veya relative yollar kullanılabilir. Herhangi bir argüman verilmezse cd ~ komutu verilmiş varsayılır ve home dizinine gidilir.Eğer ..(ikinokta) parametresi verilirse bir üst dizin .(teknokta) parametresi verilirse de mevcut çalışma dizinine gidilir. cd /home/user1 cd ../../user1
Plain (düz) (-): çoğu dosya bu türdedir, ikili(binary) veya metin dosyaları. Directory (dizin) (d): bir dosya kümesini gösterir Symbolic (sembolik) link (l): Başka bir dosya veya dizine işaretçi(pointer). Özel dosyalar; Karakter cihazı (c): klavye, yazıcı, joystick. Block cihazı (b): disk, CD-ROM. İletişim dosyaları; FIFO (p): geçici bir depolama cihazı (sıra). Soket (ler): soket dosyaları
ls -F komutu bir dosyanın türünün ne olduğunu gösterir ve dosyanın adının sonuna özel bir karakter yazdırılır.
(boş): Normal dosya *: Yürütülebilir program veya komut dosyası /: Dizin @ : Sembolik bağlantı | : FIFO (named pipe) =: Soket
-ls -i komutu
ls -i komutu her dosya için i-node numarasını yazdırır.
Dosya sistemindeki her nesne için yönetim bilgisidir. İnode'lar diskte bulunur ve isimleri yoktur. Bunun yerine, inode dizisindeki pozisyonlarını belirten endekslere (sayılara) sahiptirler. Her inode genellikle şunları içerir:
(inode yapısı cizilebilir)
touch komutu ile dosya oluşturulur veya oluşturulmuş dosyanın son değiştirilme tarihi değiştirilir.
mv komutunu bu şekilde kullanırsak file1 dosyasının adını file2 olarak değiştirmiş oluruz yani dosyaları yeniden adlandırmada kullanılabilir.
mv komutunun ikinci parametresine dizin verirsek , birinci parametredeki dosyayı bu dizine taşır.
mv komutunu bu şekilde de kullanabilir. Bu şekilde kullanıldığı zaman dizine dosyayı taşır aynı zaman dosyanın adını file2 olarak değiştirir.
cp komutu dosya kopyalama işlemlerinde kullanılır kopyalanır ad değiştirilir veya ikisini birden yapar. cp a deneme/b komutunu verirsek a dosyasını deneme dizininde b dosyası olusturarak bunu içine kopyalar.
dosya veya dosya listesini siler. link varsa oda eksilir ,dizin ile bağlantısı kopar dizinde o dosyanın yerine null atanır.Dosya silme işlemlerinde çoğu zaman parametre vermeye gerek kalmaz rm dosya_adı yazılarak dosya silinebilir.
Geçerli dizinin altında yeni bir dizin oluşturur.
sadece boş dizini silebilir.
Dizini ve alt dizinler de dahil olmak üzere içeriğinin tümünü yinelemeli olarak kaldırır. r parametresi recursive anlamına gelmektedir silerken altdan yukarıya doğru siler.
sembolik bir bağ (-s) oluşturur. link_name, başka bir dizinde veya başka bir fiziksel makinede bulunabilecek varolan dosyanın bir göstergesidir. hard link(sert bir bağlantı) oluşturmaktan kaçınılmalıdır,aynı cihazın aynı fiziksel bölümünde olmalıdır; link_name, mevcut dosya için başka bir addır.
ln -s fileA fileB yazarsak, oluşmamış fileB dosyasına sembolik link oluşturuluyor ve fileA'yı işaret ediyor.Oluşturulan bu fileB'ye farklı bir inode atanıyor fakat yapı gereği fileA'ı işaret ediyor.Eğer fileA'da içerik değişirse fileB'de de bu değişiklik görülür. fileB yani sembolik link olam dosyaya birşey yazılırsa fileA'da da içerik değişir çünkü fileB, fileA'nın bölgesini işaret ediyor.
ln fileC fileD yazarsak, fileD yapı gereği fileC'yi işaret etmek yerine direk fileC'dir yani inode'ları aynıdır bu hard link'tir. fileC'nin link sayısı bir artar bu hard link'lerde böyledir sembolik link'lerde bu artma yoktur.
Her dosyanın tek bir sahibi var. chown komutu sahibini değiştirmek için kullanılabilir; genellikle sadece root bu komutu kullanabilir. Her dosya aynı zamanda tek bir gruba aittir. Gruplar herkesten farklı izinlere sahip olabilir.
Dosyalara veya dizinlere erişime izin vermek veya vermemek için kullanılan izinler aşağıdaki gibidir; Üç tür izin vardır :
İzinler üç düzeyde verilebilir:
Kullanıcı (u)
Grup (g)
Diğer (o)
chmod
chmod komutu dosya sahibini(owner) değiştirmede kullanılır.Genellikle sadece root bu komutu kullanabilir.Yukarıda görüldüğü gibi chmod komutu iki farklı şekilde kullanılır; Daha çok kullanılan sayılar kullanılarak verilen izinlerdir sayılar belirli bir düzene göre verilebilir;
chmod 200 a.txt yazarsak a dosyasında kullanıcıya sadece yazma hakkı verilir, grup ve diğer(herkese) herhangi bir yetki verilmez. chmod 635 a.txt yazarsak kullanıcıya okuma ve yazma, gruplara yazma ve calıstırma, herkese okuma ve calıstırma izni vermiş oluruz. ikinci kullanım şeklinde grup için g,kullanıcı için u, digerleri icin o harfleri kullanılır. chmod g-r a.txt yazarsak gruplardan okuma yetkisini alır veya benzer şekilde g+rw yazarsak gruplara okuma yazma yetkisi veririz.
chgrp asd a.txt yazarak a.txt dosyasının grubunu değiştirerek asd grubuna alabiliriz.
chown hkn a.txt yazarak a.txt dosyasını başka bir kullanıcıdan alıp hkn kullanıcısına verebiliriz.
cat komutunu dosyaların içeriğine bakmak veya içeriğini değiştirmek için kullanılır. cat textfile1 textfile2 şeklinde kullanırsak önce textfile1'in içeriği hemen ardından textfile2'nin içeriğini terminalde görebiliriz.Eğer dosyanın içeriğini değiştirmek istersek cat >> textfile1 yazarak terminalde textfile1'in içine gidilir ve dosyaya yazma yapılabilir cıkmak için ctrl+c kullanılır,ama burada dikkat edilmesi gereken şey dosyanın üzerine yazma yapılır yani önceki içerik kaybolur.
Uzun bir dosyayı açmak istediğiniz zaman bütün yazılar birden önünüze açılır ve öününzde son satırların olduğu kısımları görürsünüz. Bu gibi durumlarda "more" kullanarak önce ekrana sığabilecek kadar veriyi ekrana yazdırıp daha sonra ENTER ile birer birer satır atlatma yapabilirsiniz.
Herhangi bir satır numarasından itibaren veri çekme işlemi; more +satir_numarası dosya_adi şeklinde olmaktadır.
Belirli bir kelime ile başlayan satırı içeren kısımdan itibaren veri çekme işlemi; more +/"kelime" dosya_adi şeklinde olmaktadır.
"less" komutu verileri geriye doğru ilerleterek işleme alır. Öyle ki, bir dosyayı açmaya çalıştığı zaman dosyanın tamamını açıp sonra işlemlere geçmez, herhangi bir text editör programı(mesela vi) dosyayı açaçağı zaman dosyanın hepsini yükledikten sonra açma işlemi yapar, fakat "less" komutu bunun aksine dosyayı tamamiyle ele almaz sadece istenilen, belirtilen kısımlarını işleme alır. Bu yüzden "less" diğer kelime işlemcilerden daha hızlıdır. Performans açısından daha iyidir. Kullanımı "Vi" programına benzemektedir. "more" ile kıyaslandığında "less" daha iyidir.
Komutların kullanımı, "less dosya_adi" şeklinde dosya açıladıktan sonra da herhangi bir komut harfine tıklayarak kullanabilirsiniz. Mesela dosya açıldıktan sonra "q" harfine basarsanız çıkış yapar, "-N" ile satırları numaraları ile gösterir, "& /aranan_kelime" ile aradığınız kelimeleri satırları ile beraber bulur gösterir, "G" ile sayfa sonuna gider, "g" ile sayfa başına gider, "53g" ile 53. satıra gider vb. "less" ile dosyalar üzerinde herhangi bir düzenleme yapamazsınız. "v" tuşuna basarsanız varsayılan olarak ayarlı olan text editör programınız ile dosya, düzenlenmek üzere açılacaktır.
Linux işletim sistemi, yazdığınız komutları daha kısa ve işlevsel hale getiren joker karakterleri(wildcards) desteklemektedir. Wildcard' lar, size, nispeten daha kompleks işlemler yaparken, kolaylık sağlar. Örnek olarak bir dizin altında bulunan .cfg uzantılı dosyaları başka bir dizine kopyalamak istediğimizi düşünelim. Bunun için normal şartlar altında, ya bir görsel arayüz programı kullanarak, ya da tüm dosyaları tek tek kopyala komutu kullanarak, kaynak dosyaları başka bir dizine yerleştirebiliriz. Ancak wildcards' lar sayesinde aşağıdaki gibi, çok daha kısa bir söz dizimi ile bu işlemi kolaylıkla gerçekleştirebiliriz.
cp ~/workspace/*.cfg ~/workspace2
örnekler;
*.cfg -> Sonu .cfg ile biten dosyalar
A*.cfg -> A ile başlayan Sonu .cfg ile biten dosyalar
???.txt-> 3 harfli olup sonu .txt ile biten dosyalar
[abc]* veya [a-c]-> a, b ya da c ile başlayan dosyalar,[a-c] demek a'dan c'ye kadar olan harfleri temsil etmekdir veya [a-cn-z] ifadesi ile a'dan c'ye ve n'den z'ye kadar olan karakterleri temsil ederiz.
Version.[:digit:] [:digit:] -> Version.rakam rakam formatındaki dosyalar
*[[:upper:]] -> Sonu buyuk harfli biten dosyalar
Bu komut ile herhangi bir komut hakkında detaylı bir dökümana erişebiliyoruz. Komutun tüm belgelerini gösterir.
Belirtilen anahtar kelimeyle birlikte komutların tümünü açıklamalarında gösterir. apropos yerine man -k 'da kullanılabilir.
komutun sistem yolunu verir.
SunOS'ta 3 farklı dosya sistemi vardır
Disk tabanlı dosya sistemleri sabit diskler, CDROM'lar, disketler içerir. Dağıtılmış dosya sistemleri ağ kaynaklarını yönetir. Sözde dosya sistemleri bellek tabanlıdır ve disk alanı kullanmaz
Şimdiye kadar dosya sistemindeki dosyaları değiştirdik (cp, mv, rm, ln) ve içeriğini (cat, daha az) görüntüledik. Dosyaların içeriğini nasıl düzenlersiniz? Unix editörleri düz ASCII metin dosyalarıyla çalışır: vi, emacs, pico.
Kullanılabilirlik
Komutlar anahtarlardır.
Basit ve güçlü bir metin editörü.
viden baska emacs,pico gibi editörlerde vardır vi uzakdan erişim ile teriminale bağlanabilir.
iki modu vardır.
üç komut modu var biri normal, ikincisi :'dan sonraki komutu, üçüncüsü i modu yani yazma modu
insert modunda(i'e basınca) backspace ile silebiliriz ama insert modunun dışında x ile veya shift-x ilede silebiliriz. shift+c alt satırla üst satırı birleştirir
yön tuşları veya h sol j asağı k yukarı l ise sağ yönde hareket etmemizi sağlar 4j yazınca 4 satır aşağıya gider CTRL-F sonraki sayfa u (undo) yazarsak son değişikliği iptal eder :7 yazarsak direk 7.satıra gider x cursorun üzerinde olduğu karekteri siler.(imlecin üzerindeki karekteri) dd , D yazarsak cursorun üzerinde olduğu satırı siler cc ,C cursor üzerinde oldugu kelimeyi değiştirir rx karakteri x ile yer değiştirir yy bir satırın kopyasını alır p yapıstırır j üzerinde bulundugu satır ve alt satırı birleştirir. /bil yazarsak ilk bil yazan yeri bulur //bil ikinci bil yazan yeri bulur ?bil yazarsak bu sefer yukarıya doğru arar
wq write quit (kaydeder ve çıkar) w sadece write w filename dosyaya yaz q! değişiklik olsa bile değiştirmeden çıkabilirz e filename editöre dosyayı yükle r filename cursor'ın oldugu satırdan itibaren dosyanın oldugu satıra ekle en son :W yazarsak dosyayı yazar :w! yazarsak üzerine yazar :wq yazıp yazıp cık denebilir eğer dosyada değişiklik yapıp kaydetmeden cıkmak istiyorsak :q! yazmalıyız :q ile cıkamayız daha fazla detay için :help dışında http://www.belgeler.org/lis/archive-tlkg-lis-7.2.html kullanılabilir.
/kelime ileri doğru ara ?kelime geri doğru ara n son aranan tekrar N son aranan tersi yönde tekrar
giriş karakter akışı, varsayılan giriş klavye'dir.
çıkış karakter akışı, varsayılan çıkış terminaldir.
hata mesajlarını alır, varsayılan olarak terminal ayarlıdır.
stdout'u terminale yönlendirmek yerine bir programı bir dosyaya yazmasını söyleyebilirsiniz. >filename : stdout'u bir dosyaya yönlendirir.Eğer dosya yoksa dosyayı oluşturur.Eğer dosya varsa dosyayı sıfırlar. >>filename : varolan bir dosyaya stdout ekler. örneğin; man ls > ls_help.txt (man ls komutunun cıktısını terminale yazdırmak yerine belirlenen dosyaya yazar) echo $PWD > current_directory cat file1 >> file2 (file1 dosyasını file2ye yazar ama file2deki mevcut bilgiyi korur üstüne yazmaz dosyanın devamına yazar.)
stdin'in terminalden okumak yerine bir dosyadan okumasını söyleyebiliriz. <filename : stdin'i mevcut bir dosyaya yönlendirir. <<kelime : takip eden satırlandarn sadece kelime'yi içeren satırada kadar, stdin'i yönlendirir. örneğin; mail [email protected] < message.txt at 3am < cmds or at 0945 < cmds sort < friends > sorted_friends cat << end (end kelimesi girilip stdin okuyana kadar yönlendirme yapılır, end kelimesi girildiği an yönlendirme biter ve yazılanları ekrana basar)
Bir dosya bir tanımlayıcı ile ilişkilendirilebilir. Kabuk(shell), sırasıyla her bir komut için üç standart dosyayı üç standart dosya tanımlayıcısı ile ilişkilendirir.
Standart tanımlayıcılar, kullanıcının terminali ile ilişkilendirilir, ancak başka dosyalara da yönlendirilebilirler.
Yazmak üzere bir dosyayı açmak için bunlardan birini kullanın. exec n> filename (dosyayı yazma işlemi için açıyoruz , yazma işlemi kullanıldığında n dosya tanımlayıcıyı oluşturuyor. exec n>> filename (sonundan itibaren yazmak üzere n oluşturuluyor) n bir tamsayıdır ve dosya adı, yazmak için açılan dosyanın adıdır. İlk form, eğer böyle bir dosya varsa, belirtilen dosyanın üzerine yazar. İkinci form belirtilen dosya adına eklenir. Bir dosyayı okumak üzere açmak için exec n<filename (okuma işlemi için açılıyor, okumak için n'nin file nesnesi oluşturuluyor) Hem okuma hem de yazma için bir dosyayı açmak için exec n<> filename (n adında dosya tanımlayıcısı oluşturuluru)
Standart çıktıyı, dosya tanıtıcısı n ile ilişkilendirilmiş dosyaya yönlendirmek için, komut>& n (n bağlı olduğu dosyaya yazıyor, terminalde yazılacak veri n'nin bağlı olduğu dosyaya yazılır) Standart girişi, dosya tanımlayıcısı n ile ilişkilendirilmiş dosyadan yönlendirmek için, komut<&n (komut bilmez veriyi nereden aldığını) exec n> & -: çıktı dosyası tanımlayıcısı n kapalı. exec 1>&- , exec>&-: standart çıkış kapalı. exec n <& -: giriş dosyası tanımlayıcısı n kapalı. exec 0<&- , exec<&-: standart giriş kapalı.
Bir dosyaya yazma; exec 4> dosya ("dosya" yı açın, fd 4 atayın.) ls> & 4 (ls çıktısını "dosya" ya yaz)
Bir dosyadan okuma exec 5 <dosya ("dosya" yı açın, fd 4 atayın.) wc <& 5 ("dosya" dan giriş oku)
Bir dosyada belirtilen bir yere yazma echo 1234567890 > dosya ("dosya" ya dize yaz.) exec 3<> dosya ("dosya" yı açın, ona fd 3'ü atayın.) read -n 4 <&3 ( Sadece 4 karakter oku.) echo -n . >&3 (Oraya bir ondalık işareti yazın.) exec 3>&- (fd 3'ü kapatın.) cat dosya ( ==> 1234.67890)
Standart çıkış veya giriş yönlendirmesi açıkça aşağıdaki genel şekilde belirtilir.
STDOUT ve STDERR dosyalarını ayrı ayrı dosyalara yönlendirmek için kullanılan temel sözdizimi;
İlk form STDOUT dosyasını fileA'ya ekler ve STDERR'yi fileB'ye yönlendirir. İkinci form STDOUT'u fileA'ya yönlendirir ve STDERR'yi fileB'ye ekler. Üçüncü form STDOUT dosyasını fileA'ya ekler ve STDERR'yi fileB'ye ekler.
Aynı dosyaya STDOUT ve STDERR yönlendirmek veya eklemek için temel sözdizimi; komut >file2>&1 veya command &> file komut >>file2>&1 STDOUT (dosya tanımlayıcısı 1) ve STDERR (dosya tanımlayıcısı 2) belirtilen dosyaya yönlendirilir veya eklenir. komut 2>&1>>file (bunu yukarıdakiyle karşılaştır).
m> & n: dosya tanımlayıcıları m, n'ye yönlendirilir. >&n: standart çıkışı n dosya tanımlayıcısına yönlendirilir Örnek; rm -rf /tmp/my_tmp_dir > /dev/null 2>&1 rdate ntp.nasa.gov >> /var/log/rdate.log 2>&1 if [ ! -f $FILE ]; then echo "$FILE is not a file" >&2; fi
Pipe (|): Bir komutun stdout'unu diğerinin stdinine bağlar. Örnekler;
ls –la | less ls –al | wc ls-al | sort +4r cat file | wc man bash | grep "history" ps aux | grep user1 | wc –l
Bir seferde birden fazla program çalıştırmak için;. Noktalı virgülle (;) ayrı komutlar yazılabilir
Aynı anda birden fazla program çalıştırmak için; Komutun sonunda ve işaretini (&) kullanın. ls -al & wc * (paralel bir şekilde koşar hangisinin nezaman biteceği kesin değildir.)
Filtre,girişi alan ve bir şekilde dönüştüren bir programdır.
wc komutu wc , satır / sözcük / karakter sayısı verir
grep komutu
grep , belirli bir örneğe sahip hatları arar
grep
sort komutu sort , satırları alfabetik veya sayısal olarak sıralar sort -r: normal sıralama düzenini tersine çevirir sort -n: sayısal sırada sıralar sort + 2n: ikinci sütundaki öğeleri sıralar
cut komutu cut - stdout'a gönderilecek her satırın parçalarını seçer. cut -c1-5: her satırın ilk 5 karakterini seç cut -c1,5: her satırın ilk ve beşinci karakterlerini seç cut -d: -f1,3 /etc/passwd: kullanıcı adlarını ID'leriyle eşleştir
head komutu head , dosyaların ilk birkaç satırını gösterir. head -n <dosyaadı> , n: bir tam sayı
tail komutu tail , dosyanın son bölümünü görüntüler tail -n <dosyaadı> : son n satırı . tail + n <dosyaadı>: n. satırdan sonraki satırlar
diff komutu diff ,farklı olan tüm satırları gösterir.
cmp komutu
cmp , iki dosyanın farklı olduğu ilk yeri bul
<diff / cmp>
od komutu od , Bir dosyanın içeriğini sekizlik(oktal) gösterimini gösterir. Örneğin. od –c: tüm baytların görsel gösterimi
ls -lt komutu ls –lt , zaman sırasına göre dosya listesi
crypt komutu crypt , bir dosyayı kodlama veya kod çözme Örneğin. şifreli anahtar <clear.file> encrypted.file
tr komutu
tr , girişindeki karakterleri çevirir.
tr "[: lower:]" "[: upper:]" <
uniq komutu
uniq , bir dosyadaki tekrarlanan satırları rapor eder veya filtreler.
uniq –d
pr komutu pr , dosyaları çeşitli şekillerde yazdırır. ls -a | pr -n -h $ (pwd) , geçerli dizindeki tüm dosyaların numaralandırılmış bir listesini yazdırır.
Aşağıdaki komut ne yapar? cat * | tr -sc A-Za-z '\012' | sort | uniq –c | sort –n | tail | pr -5 –t
talk komutu talk ,sisteme kayitli olan baska bir kullanici ile etkileşimli sohbet Örneğin. talk hakan pts/2
write komutu write, başka bir kullanıcıya mesaj gönderme Örneğin. write hakan pts/2 mesg [n | y] : mesajlara izin ver / reddet
mail, pine : text tabanlı e-posta programı
ftp, sftp : metin tabanlı FTP programı
telnet, ssh : doğrudan diğer makinelere bağlanmak için kullanılır
lynx : metin tabanlı web tarayıcısı
ps komutu ps , mevcut süreçleri listeler
top komutu top , sistemin süreçler tarafından kullanımının dinamik gösterimini yapar
kill komutu
kill , belirlenen bir süreci sonlandır (varsayılan: SIGTERM)
kill –9
time komutu time, bir süreç için zamanlama bilgisini tutar ve gösterir. time ls (real / user / sys zamanı gösteriliyor).
wait komutu wait , & ile başlayan tüm işlemleri bekliyor.(belli bir işlemi bekleme)
nohup komutu nohup , oturumu kapattıktan sonra komutu çalıştırmaya devam ettirir.
nice komutu
nice , komutu düşük öncelikle çalıştırmaya devam et.
nohup / nice
Çalıştırılabilir binary bir program, başında "sihirli sayı" ile işaretlenmiştir. od / bin / ed 0000000 077505 046106 000402 000400 000000
du komutu du , ne kadar disk alanı kullandığını gösterir. du <dosya / dizin> (disk blokları cinsinden)
df komutu df , bağlı dosya alt sistemlerindeki alanı gösterir. df –k (disk blokları cinsinden) (bir blok = 512 veya 1024 bayt)
Temel düzenli ifadelerde; meta karakterleri ?, +, {,}, (,), |, ve ) özel bir anlamı yoktur (grep) Onlara özel bir anlam vermek için kaçış versiyonlarını kullanın: ?, +, {, }, (, ) ve |
Genişletilmiş düzenli ifadeler kullanıldığında, bu meta karakterlerin özel bir anlamı vardır grep –E = egrep
egrep pattern filename(s)
Güvenli olmasu için, pattern(model) çevresine tırnak işaretleri yerleştirin. Örnekler: egrep "abc" textfile (dosyada “abc” içeren satırları yazdırır) egrep -i "abc" textfile (yukardakiyle aynı, ancak büyük/küçük harf farkını yoksayar ikisinide gösterir.) egrep -v "abc" textfile (dosyada “abc” içermeyen satırları yazdırır) egrep -n "abc" textfile (satır numaralarını ile beraber yazdırır) egrep -c "abc" textfile (dosyada “abc” içeren satır sayısı yazdırır)
Nokta(period)(.): Herhangi bir karakterle eşleştirir.
“a.c” abc, adc, a&c, a;c, ... ile eşleşir
“u..x” unix, uvax, u3(x, ...ile eşleşir
Yıldız işareti(): önceki RE'nin sıfır veya daha fazla oluşumuyla eşleşir.
Kabuktaki joker karakterlerle(wilcards) aynı değildir!
“abc” ac, abc, abbc, abbbc, ... ile eşleşir. (yani a karakteri ile c karakteri arasında b karakterinden kaç tane olduğu önemsizdir. çünkü * işareti önceki RE'yi kasteder yani b'yi )
“. *” Herhangi bir string'le eşleşir.
Artı(+): önceki RE'nin bir veya daha fazla tekrarını eşleştirir “ab+c” abc, abbc ile eşleşir ancak ac ile eşleşmez (yani a karakteri ile c karakteri arasında b karakterinden en az bir tane olmalı, en fazla kaçtane olduğu ise önemsizdir.çünkü * işareti önceki RE'yi kasteder yani b'yi )
Soru işareti (?): Önceki RE'nin sıfır veya bir tekrarı ile eşleşir “ab?c” ac, abc ile eşleşir ancak abbc ile eşleşmez
Mantıksal veya (|): bar öncesi RE veya bar sonrası RE ile eşleşir “abc | def”, abc veya def ile eşleşir
Şapka (^): satırın başlangıcı anlamına gelir “^D.*”, D ile başlayan bir satırla eşleşir
Dolar işareti ($) satır sonu anlamına gelir “.*d$”, d ile biten bir satırla eşleşir
Ters eğik çizgi (\): diğer meta karakterlerden kaçar yani meta karakterler ile normal karakterlerin karışmasını önler “file\.txt”, file.txt ile eşleşiyor ancak file_txt ile eşleşmiyor
Köşeli parantez ([]): bir karakter kümesi listesini belirtir. kümedeki herhangi bir karakter eşleşecek ^ 'den sonraki karakterler ile eşleşmeyecek . -bir karakter aralığını belirtir. Örnekler:
“[fF]un” fun,Fun ile eşleşir. Yani F yada f olmalı. “b[aeiou]g” bag, beg, big, bog, bug ile eşleşiyor. “[A-Z].”, Büyük harfle başlayan bir dizeyle eşleşir “[^Abc].” a, b veya c ile başlamayan dizelerle eşleşir
“a(bc)*” ifadesi a, abc, abcbc, abcbcbc, ... ile eşleşir. “(foot|base)ball” football ya da baseball ile eşleşir
“[a-z]{3}” üç küçük harfle eşleşiyor.Yani en az üç küçük harf barındırıyorsa “m.{2,4}” dizeleri m ve ardından 2 ile 4 karakter arasında eşleştirir.
Örnekler egrep ”^B.s$” dosya egrep ”[0-9]{3}” dosya egrep ”num(ber)? [0-9]+” dosya egrep ”word” dosya | wc -l egrep ”[A-Z].?” dosya ls -l | egrep "^....r.-r.-"
Ya grep kullanılırsa? En az iki 0 içeren kullanıcı kimliğine sahip kullanıcıları arayın grep "^[^:]:[^:]:[^:]0[^:]0[^:]:." /etc/passwd
/etc/passwd dosya formatı; <username>:\x:<userid>:<groupid>:<useridinfo>:<homedir>:<loginshell> x karakteri, şifreli parolanın /etc/shadow dosyasında saklandığını gösterir.
Sistem yazım denetimi için küçük bir sözlüğe sahip olabilir:/usr/dict/words Beş sesli harfin tümünü içeren kelimeleri alfabetik sırayla bulun.
cat alphvowels. ^[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]u[^aeiou]$ egrep -f alphvowels /usr/dict/words
Harfleri alfabetik sırada olan altı veya daha fazla harften oluşan tüm kelimeleri bulun. cat > monotonic ^a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?x?$ egrep -f monotonic /usr/dict/words | grep "......"
pratik: En az 10 karakterden oluşan bir sözcükle başlayan satırlar. Standart 3 bölümlü formda öğrenci kimliği içeren satırlar. Ardışık 2 büyük harfli sözcük içeren satır sayısı. Alfabetik karakterle bitmeyen satır sayısı. Bir cümlenin sonunda sesli harfle başlayan bir kelimeyi içeren satırlar.
Kullanıcı ve işletim sistemi arasındaki komut satırı arayüzüdür. Giriş sırasında otomatik olarak başlar. Hem komut yorumlayıcısı hem de programlama dilidir. Kabuk betiği(Shell script), kabuk yorumlaması için mantık içeren bir metin dosyasıdır.
Bash bu döküman için standart kabuktur. Bourne kabuğunun üst kümesidir(sh). Sh, csh, tcsh & ksh'dan ödünç alınan özellikler vardır. GNU projesinin bir parçasıdır.
Çalışan bir kabuk için üç ana değişken türü vardır;
Yerel(local) değişkenler; Şu anki kabuğun içinde mevcut olan değişkenlerdir. Komut isteminde, değişkene değer atanır.
Ortam(environment) Değişkenleri; Herhangi bir alt kabuk işlemi(child process) için kullanılabilir
Kabuk değişkenleri; Kabuk tarafından değer atanması(set) gerekir.
Kabuğun belirli işlemler için kullandığı değişkenler kümesidir. Kabuk değişkenleri şunları içerir:
Geçerli ortam değişkenlerinin listesi, env komutu ile görüntülenebilir. Değişkenlerin bir adı ve değeri vardır.Varname değerini(listedeki herhangi bir değişkenin adı), echo $varname ile standart çıktıya gönderilerek terminale yazdırılabilir.
Bazı ilginç değişkenler: HOME, PWD,PATH, PS1, USER, HOSTNAME $ HOME: home dizini (cd için varsayılan değişken) Örnek: /home/0607/student $ PWD: mevcut çalışma dizini Örnek: /export/home/staff/usern $ PATH: komutlar için arama yolu Örnek: /usr/local/bin:/bin:/usr/bin $ PS1: komut istemi (varsayılan “$”) Örnek: \u@\h:\w$ $ USER: kullanıcı adı Örnek: usern $ HOSTNAME: bilgisayar hostname Örnek: ktuce
Diğer ilginç değişkenler: UID, PPID, RANDOM, HISTFILE, HISTSIZE, MAIL, MAILCHECK, PS2 $ UID: mevcut kullanıcı kimliği $ PPID: Kabuğu çalıştıran programın işlem kimliği $ RANDOM: 0-32767 arasında rastgele bir tam sayı oluşturur $ HISTFILE: komut geçmişini saklamak için dosya $ HISTSIZE: saklanacak komut sayısı $ POSTA: posta gelmişmi diye kabuk tarafından kontrol edilen dosya $ MAILCHECK: kontroller arasındaki saniye sayısı $ PS2: İkincil komut istemi (varsayılan ">")
Değişkeni varname = value ile ayarlayın PS1 = $USER@$HOSTNAME: Varsayılan kabuk istemini değiştirir PS1 = "bash_prompt>" PATH = $PATH:$HOME/bin , $HOME/bin yolu PATH değişkenine atandı PATH = $PATH:~:. , ~ :. PATH'a atandı DATE=`date` veya DATE=$(date) , DATE değişkeni oluşturduk ve bu değişkene sistem saatini atadık.
<tab> geçerli komutu veya dosya adını tamamlama girişiminde bulunur.
pus<tab> genişler(tamamlar) için pushd<space>
pu<tab> alternatifleri verir. yani pu ile başlayan alternatif komutları gösterir bazen 2 kez <tab> yapmak gerebiliyor.
pu pup pushd
/etc içinde, ls init
Takma adlar, sık kullanılan komutlar için kısa yol olarak kullanılır. Sözdizimi: alias kısayol=komut Örnekler: alian asd=ls (artık ls komutuna asd adında bir kısayol atadım terminale asd yazdığım zaman ls komutunu çalıştıracak. alias pu=pushd alias po=popd alias l= " ls –F -C " alias ll= " ls –L –l -F " alias d=dirs alias hide= " chmod og-rwx " alias unhide= " chmod og+r "
history,önceden girilmiş komutları listelemek için kullanılır. m'den n'ye kadar önceden yazılmış komutları listelemek için (fc -l <m> <n>) kullanılabilir.Bu komutla ilk m ile başlayan satırdan sonra ilk n ile başlayan satıra kadarki geçmiş komutları yazdırır. fc -l ls man tarzı bir kullanımda mümkündür Geçmiş listesinde gezinmek için imleç tuşlarını yukarı ve aşağı kullanılabilir.
bash bir dizi satır düzenleme komutu sağlar. Varsayılan emacs modu komutları.(Terminalde komut yazarken uygulanabilecek kısa yollar.) Esc-b Bir kelime geri git Esc-f Bir kelime ileri git Ctrl-a Satırın başına gitme Ctrl-e Satırın sonuna gitme Ctrl-k İmleçten satır sonuna kadar olan metini siler. Diğer taraftan, ksh kullanıyorsanız komut satırını etkileşimli olarak birkaç şekilde düzenleyebilirsiniz. set -o vi, komut satırını düzenlemek için vi komutlarını kullanmanızı sağlar. set -o vi-tabcomplete ayrıca bir TAB girerek komutları/dosya adlarını tamamlamanıza izin verir.
Her oturum açtığınızda takma adlar, ortam değişkenleri, komut satırı düzenlemeleri vb. Girmek istemezsiniz. Bütün bunlar, kabuk her başlatıldığında çalıştırılan bir betikte(script) yapılabilir.
Başlangıçta çalıştırılan başlangıç komut dosyaları; /etc/profile ~/.bash_profile ~/.bash_login (eğer .bash_progile yoksa) ~/.profile (eğer ikiside yoksa)
Giriş yaptıktan sonra komut dosyası çalıştırıldı ~/.bashrc Oturum kapatıldıktan sonra komut dosyası çalıştırıldı ~/.bash_logout
örnek .bash_ profile (partial);
# .bash_ profile: oturum açma kabukları için bash tarafından yürütülür. umask 022 (0666 & ~022 = 0644 = rw-r--r--) # varsa, .bashrc komutunu ekleyin if [ -f ~/.bashrc ]; then . ~/.bashrc fi # değişkenleri ayarla export CVSROOT=~/.cvsroot export EDITOR=/bin/vi export PAGER=/usr/bin/less
örnek .bashrc (partial)
# .bashrc # bazı genel komutların kısaltmaları alias bye=logout alias h=history alias l='ls –F -C' alias ll='ls-L –l -F' alias po=popd alias pu=pushd
Csh için, giriş kabukları çalıştırılır: ~/.profile ENV ayarlanmışsa: Bu dosya her yeni terminal için yürütülür örnek: ENV=$HOME/.cshrc EXPORT ENV (for bash)
Bir kabuk betiği nedir?
.......
komut dosyasını bir argüman gibi kabuk komutuna verin; bash my_script
veya komut dosyasının ilk satırında kabuğu(shell) belirleyin; #!/bin/bash komut dosyasının çalıştırılabilir olduğundan emin olun. my_script 'i doğrudan komut satırında çalıştırın.
Derlemek yoktur, kabuk tarafından yorumlanır.
Basit bir script; #!/bin/bash echo "Hello, World!" path=$(pwd) echo $path
Result: Hello, World! /home/user2
##Sayısal Değişkenler
Tamsayı değişkenleri bash'te kullanılabilecek tek saf sayısal değişkenlerdir. beyan(declaration) ve set değeri:
Sayısal ifadeler çift parantez içine alınır (C stilinde). Genel format:
var = $((ifade)) veya var = $[ifade] Örneğin. i = $((var ++)) veya ((var + = 1)) Örneğin. i = $((var2 = 1 + $ var)) veya ((var2 = 1 + var)) Örneğin. i = $[var + 2] - [var + = 2] Hata! Örneğin. echo $((var * 7)) veya echo $[var * 7] Örneğin. echo ((var2 = 1 + var)) veya echo [var2 = 1 + var]
Operatörler C / C ++ ile aynıdır. ! +, -, *, /,%, &, |, <,>, <=,> =, ==, =, &&, ||, + =, -! =, * =, / =,% = ~, ~ =, <<, >>, ^
Açıkça başka bir tür olarak bildirilmediği sürece, değişkenler string'dir. var = 100, var'ı "100" string'i yapar. Bununla birlikte, değişkeni çift parantez içine koymak bir tamsayı olarak kabul edilir. ((var2 = 1 + $ var))
Alt stringlerin kullanılması;
Birleştirilen strings;
Manipüle string
Değişkenin Yerine koyma;
Dosya adı değiştirme karakterleri (*,?, [...],!) modelde kullanılabilir.
Bir dizi bildirmek için declare –a komutu kullanılabilir.
declare -a sports
sports=(basketball football soccer)
spor [3] = hokey
dizi oluşturma sports=(football basketball) moresports=($sports tennis)
${array[@]} or ${array[]} dizinin tüm içeriğini belirtir. echo ${moresports[]} Çıkış: football tennis
${#array[]} dizideki değerlerin sayısını döndürür. echo ${#moresports[]} Output: 2
Export komutu , kabuğun alt(child) süreçlerin değişkene erişmesine izin verir.
export –p değişkenlerin ve kabuğunuz tarafından verilen değerlerin bir listesini gösterir.
vartest bir program $> cat vartest echo x = $x echo y = $y $> x=100 $> y=10 $> vartest x = y = $> export y $> vartest x = y = 10
Parantez içinde bir veya daha fazla komut alt kabukta yürütülür
Kıvrımlı ayraçlar içindeki bir veya daha fazla komut geçerli kabuk tarafından yürütülür
Eğer argümanlar bir betiğe(script) geçirilirse, $1,$2,$3, vb. Değerlere sahiptirler.
Shell, $ ve ‘ ‘(çift tırnak) işaretleri içindeki ifadeleri yorumlar
Shell özel karakterleri tek tırnak işaretleri içinde yorumlamaz.
echo '`date +%D`' # `date +%D`
\ , karakterlerden kaçmak için kullanılır (örneğin, \ ”, \ $)
Komut dosyaları bir tamsayı değeri döndürebilir return N kullanılır. $? Değişkeni Son çalıştırılan komutun dönüş değerini içerir. Koşulları test etmek için kullanılabilir $> pwd /home/user $> echo $? 0 $> pwdd pwdd: not found $> echo $? 127
Örnekler:
Değişken isimleri: __FRUIT, TRUST_NO_1, _2_TIMES (geçerli) 2_TIMES, _2*2, NO-1 Invalid (geçersiz)
FRUIT=peach FRUIT=2apples FRUIT=apple+pear+kiwi
Boşluk kullanımına dikkat edin. $> FRUIT=apple orange plum bash: orange: command not found. Tırnak kullanın. $> FRUIT="apple orange plum"
Genel biçim:
Okuma yürütüldüğünde, kabuk; standart girdiden bir satır okur. ilk sözcüğü <değişken> 'de listelenen ilk değişkene atar . ikinci sözcüğü ikinci değişkene atar. buna benzer şekilde okuma ve atama yapar.
Satırda listelenen değişkenlerden daha fazla kelime varsa, fazla sözcük son değişkene atanır.
girilen ilk satırı okur, ilk sözcüğü x değişkeninde saklar ve satırın kalanını y değişkeninde saklar. Örnek
Komuttan stdout ile değiştirme; var=`komut` (' ' arasında geri alıntı yapar) var=$(komut)
İfade değeri ile değiştirme;
var = $((expresssion))
Örnekler: $> echo ‘date‘ # date komutunun çıktısını görüntüler $> echo sistemde çalışan `who | wc –l` kişi var # bunun çıktısını görün c = $ ((2 + 3 * 4)) # "echo $ c" 14 görüntüleniyor
Bash, aritmetik ifadeleri, aritmetik yerdeğiştirme olmadan değerlendirmeyi destekler. Sözdizimi dolar işareti olmadan $((...))'a benzer. $> x=10 $> ((x=x*12)) $> echo $x # 120 verir. Aritmetik ifadeler, if, while ve until komutlarında kullanılabilir.
Karşılaştırma operatörleri çıkış durumunu ayarlar(set'ler) Karşılaştırma sonucu yanlış ise sıfır olmayan bir değer sonuç doğruysa sıfır değeri ((i == 100)) eğer i, 100'e eşit ise çıkışa 1(true)dönderir, aksi halde çıkışa sıfır(false) dönderir. if((i == 100)) ... [“$i” –eq 100] ile aynı etkiye sahip
expr komutu, kullanıcı tanımlı değişkenler üzerinde hesaplamalar yapmak için başka formlar sağlar
expr val1 op val2 (boşluklarla ayrılmış) expr $val1 op $val2 val3 = `expr $val1 op $val2`
Örnekler; $>expr 5 + 7 #12 döndürür $>expr 6 – 3 – 2 # gives 1 $>expr 3 + 4 \* 5 # gives 23 $>expr 24 / 3 # gives 8 $>sum= `expr 5 + 6` $>echo $sum # gives 11 $>a=12 $>b=90 $>echo sum is $a + $b # sum is 12 + 90 $>echo sum is `expr $a + $b` # sum is 102
Kabuk tarafından dahili olarak ayarlanan ve kullanıcıya sunulan bazı değişkenler vardır: 1$ - $9: Konumsal parametreler $0: Komut adı $#: Konumsal argümanların sayısı $? : Yürütülen son komutun çıkış durumu ondalık dizgesi (0,1,2 ..) olarak verir. $$: Eşsiz(unique) dosya isimleri oluşturmak için yararlı olabilen, çalışılan kabuğun süreç(process) numarası. $! : Arka planda çalışan son komutun işlem kimliği (Son arka plan işleminin PID'sini tutar). $- : Kabuğun bu çağrısına uygulanan tedarik edilmiş mevcut seçenekler. $* : $1 'dan başlayan, kabuğun tüm argümanlarını içeren bir dize. $@: Alıntılananlar hariç, yukarıdakiyle aynı.
Not: $* ve$ @ alıntı yapıldığında aynıdır ve değişkenlere genişler. "$*", boşlukla birleştirilmiş, kabuğun tüm argümanlarını içeren tek bir kelimedir. Örneğin, '1 2' 3 , "1 2 3" olur. "$@", kabuk tarafından alınan argümanlarla aynıdır, sonuçta ortaya çıkan sözcük listesi, kabuğa verilenlerle tamamen eşleşir. Örneğin, '1 2' 3 , "1 2" "3" olur.
Standart UNIX komutları gibi, kabuk komut dosyaları(shell scripts)'da komut satırından değişken alabilir. Bağımsız değişkenler, komut satırından $1 ile $9 arasındaki konumsal parametreler kullanılarak bir kabuk programın içine geçirilir. $0 konum parametresi, komut adını veya kabuk komut dosyasını içeren yürütülebilir dosyanın adını belirtir. Tüm konumsal parametreler $* özel parametresi kullanılarak ifade edilebilir.
Examples
$ cat pass_arg. # 5 sayı kabul eden ve toplamını gösteren bir script. aktarılan parametrelerin gösterimleri(echo ile) : $1, $2, $3, $4, $5 betiğin adının gösterimi (echo ile) : $0 aktarılan parametrelerin sayısı(echo ile) : $# sum=`expr $1 + $2 + $3 + $4 + $5` toplamları : $sum
Bir komut dosyasına 9'dan fazla parametre iletilirse, parametrelere erişmek için iki alternatif vardır:
Notasyonu ${n} shift komutu
Shift komutu parametreleri bir konum sola kaydırır. Shift komutunun yürütülmesinde, ilk parametrenin üzerine ikincisi yazılır, ikinci'nin üzerine üçüncü yazılır ve bunun gibi devam eder.
Örnek;
Farklı sayıları kabul edecek ve toplamlarını bulacak bir komut dosyası yazalım. Parametrelerin sayısı değişebilir.
$ cat sum_arg sum=0 while [ $# -gt 0 ] do sum=`expr $sum + $1` shift done echo sum is $sum
Örnek; Bu örneği birtane script dosyasının içine yazıp daha sonra sh script.sh 1 2 3 4... şeklinde parametreler vererek terminalden çağırıp deneyebilirsiniz.
#!/bin/bash echo "arg1=$1 arg2=$2 arg3=$3" shift echo "arg1=$1 arg2=$2 arg3=$3" shift echo "arg1=$1 arg2=$2 arg3=$3" shift echo "arg1=$1 arg2=$2 arg3=$3"
Kabuk yerleşik bir null komutuna sahiptir
formatı basit;
Amaç hiçbir şey yapmamak
Genellikle bir komutun, özellikle de komutlarda görünmesi gerekliliğini yerine getirmek için kullanılır.
if grep “^$system” ~/mail/systems > /dev/null then : else echo “$system is not a valid system” exit 1 fi Kabuk, bundan sonra bir komut yazmanızı gerektirir. Sistem geçerliyse, hiçbir şey yapılmaz
Kabuk, bir önceki komutun başarılı veya başarısız olmasına bağlı olarak bir komutu çalıştırmanıza olanak tanıyan iki özel yapıya sahiptir.
&& operatörü eğer önceki komut başarılı bir şekilde derlenirse sonraki komutu uygular.
komut2 yalnızca komut1 sıfır çıkış durumunu döndürürse çalıştırılır. örnek; [ -z $EDITOR ] && EDITOR=/bin/ed
|| operatörü eğer önceki komut başarısız bir şekilde derlenirse sonraki komutu uygular.
komut2 yalnızca komut1 sıfır olmayan bir çıkış durumu döndürdüğünde çalıştırılır
Örnekler; [ -z $PATH ] || echo $PATH grep "$name" phonebook || echo \ “Not found $name“ who | grep "^$name " > /dev/null || echo \ "$name's not logged on“
(Satırın sonunda \ kullanıldığında, kabuğun satıra devam ettiğini bildirir.)
&& ve || Aynı komut satırında da birleştirilebilir:
who | grep "^$name " > /dev/null && \ echo "$name is logged on" || echo "$name’s \ not logged on"
Grep başarılı olursa ilk echo gerçekleşir;başarısız olursa ikinci echo.
Bu operatörler if komutları ile temsil edilebilir.
if grep "$name" phonebook then : else echo "Couldn't find $name“ fi
Her Unix komutu, çıkışta kabuğun sorgulayabileceği bir değer döndürür. Bu değer salt okunur kabuk değişkeni $? İçinde tutulur.
0 (sıfır) değeri başarıyı gösterir; 0 (sıfır) dışında herhangi bir şey başarısızlık anlamına gelir.
Tamsayı kullanıyorsanız: ((koşul)) Dizeler kullanılıyorsa: [[koşul]] Çıkış durumları duruma bağlı olarak sıfır veya sıfır değildir Örnekler: (( a == 10 )) (( b >= 3 )) [[ $1 = -n ]] [[ ($v != fun) && ( $v != games) ]] (( Z > 23 )) && echo Yes
Dosya varlığı, dosya izinleri, sahiplik, dosya türü vb. İçin özel koşullar.
İf ifadesi verilen komutun çıkış durumunu kullanır ve şartlı olarak aşağıdaki ifadeleri çalıştırır.
Genel sözdizimi: if koşul then komutlar (koşul doğruysa) else komutlar (koşul yanlışsa) fi
İç içe if ifadesi: if (-----) then ... else if ... ... fi fi
elif ifadesi, else if ifadesi için kısa yol olarak kullanılabilir.
örnek: if [[ -r $fname ]] then echo “$fname is readable” elif [[ -w $fname && -x $fname ]] then echo “$fname is writeable and executable” fi
Unix sistemi, önceki komutun çıkış durumunu araştıran ve sonucu başarı ya da başarısızlık biçiminde çeviren, yani sonucu 0 ya da 1 olan test komutu sağlar.
Test komutu herhangi bir çıktı üretmez, ancak testin başarısız olup olmadığını kontrol etmek için çıkış durumu if ifadesine geçirilebiliriz.
Herhangi bir komutun çıkış durumunu nasıl öğrenebilirim?
Tüm komutlar çıkış durumunu, echo komutu kullanılarak görüntülenebilen önceden tanımlanmış bir Shell Değişkenine ‘?’ Döndürür. Örneğin; echo$? Bunun çıktısı 0 (Sıfır) ise önceki komut başarılı olmuş demektir veya çıktı 1 (Bir) ise önceki komutun başarısız olduğu anlamına gelir.
Test komutunun aşağıda açıklanan dosyalar, sayısal değerler ve diziler üzerinde çalışması için belirli operatörleri vardır: Test komutuyla kullanılan Sayısal
Değişkenlerdeki İşleçler:
Test komutuyla kullanılan String Değişkenleri işleçleri:
Örnekler: $> a=12; b=23 $> test $a –eq $b $> echo $? # 1verir $> name=”Ahmet” $> test –z $name #return 1 $> test –n $name #return 0 $> test –z “$address” $> test $name = “Ali”
Test komutuyla kullanılan dosyalardaki operatörler:
Örnekler: $> test –f “mydoc.doc” # mydoc.doc dosyasını kontrol eder, varsa 0, yoksa 1 döndürür. $> test –r “mydoc.doc” # mydoc.doc için okuma izni olup olmadığını denetler $> test –d “$HOME” # kullanıcıların ana dizininin varlığını kontrol eder..
Birden fazla koşulu birleştirmek mantıksal AND, OR ve NOT işleçleriyle yapılır.
$> test –r “mydoc.doc” –a –w “mydoc.doc” # mydoc.doc dosyasının hem okuma hem de yazma iznini kontrol eder ve sonucA bağlı olarak 0 veya 1 döndürür.
if who | grep -s hakan > /dev/null then echo hakan CE sunucusuna giris yapti else echo hakan CE sunucusunda mevcut degis fi
Bu script, şu anda sisteme giriş yapmış olan kişileri listeler ve çıktıyı grep üzerinden pipe ile yönlendirir.
Sözdizimi: case expression in pattern1) commands ;; pattern2) commands ;; ... *) commands ;; esac
örnekler:
örnek1:
case $1 in
-a)
a seçeneğiyle ilgili komutlar ;;
-b)
b seçeneğiyle ilgili komutlar ;;
*)
diğer tüm seçenekler ;;
esac
örnek2:
clear
echo "1. Date and time"
echo
echo "2. Directory listing"
echo
echo "3. Users information "
echo
echo "4. Current Directory"
echo
echo –n "Enter choice (1,2,3 or 4):"
örnek3:
read choice
case $choice in
1) date;;
2) s -l;;
3) who ;;
4) pwd ;;
*) echo wrong choice;;
esac
bu komutları birtane script dosyasının içine yazıp bu dosyayı terminalden çalıştırdığımız zaman bizden birtane argüman ister bu argümanı okuduktan sonra 1,2,3,4 veya diğer olacak şekilde ayırarak farklı komutları çalıştırır.
Sözdizimi:
for var [in list ]
do
commands
done
Tek bir satırdaki komutlar noktalı virgülle (;) ayrılır.
Liste belirtilmezse, $@ kabul edilir.
Aksi takdirde ${list [*]} , Burada liste bir dizi değişkenidir.
örnekler:
for colors in Red Blue Green Yellow Orange Black Gray
do
echo $colors
done
echo
Bu örnek verilen tüm renkleri terminale yazdırır.
Sözdizimi:
while command-list1
do
command-list2
done
command-list1'deki son komutun çıkış durumu 0 (sıfır) ise, command-list2'deki komutlar yürütülür.
Anahtar kelimeler break, contiune ve return , C / C ++ ile aynı özelliklere sahiptir.
break [num] veya contiune [num] # num döngü sayısıdır
Sözdizimi:
Until command-list1
do
command-list2
done
Döngü, command-list1'in çıkış durumu sıfır olmadıkça gerçekleştirilir.
While/until komutunun çıkış durumu, command-list2'de yürütülen son komutun çıkış durumudur. Eğer böyle bir komut listesi çalıştırılmazsa, while/until çıkış 0 durumundadır.
örnekler:
... (Bölüm 7 henüz bitmedi devam edicek :))
Bir kabuk fonksiyonunun tanımı aşağıdaki gibidir:
isim(){list ;}
Geçerli ve geçersiz fonksiyon tanımları:
lsl(){ ls -l ; } # geçerli
lsl { ls -l ; } # geçersiz
sh için takma ad tanımlama:
$> cat mycd
cd () { chdir ${1:-$HOME} ; PS1="`pwd`$ " ; export PS1 ; }
$> source mycd
Örnekler:
yazdir(){
for i in {1..13}
do
echo "hakan"
echo "$i"
done
}
Bu fonksiyon 13 kere hakan ve sırasıyla sayıları yazar ama bu fonksiyonu terminalde koşabilmek için dosyayı source etmemiz gerekir.Bunuda şu şekilde yaparız.
Bu komuttan sonra dosyamızdaki fonksiyonu ismiyle çağırabiliriz(sadece mevcut terminalde):
yazdir
hakan
1
hakan
2 ...
Her dizinin tek bir satırda listelenmesiyle, PATH'nin geçerli değerini listelemek:
lspath() {
OLDIFS="$IFS"
IFS=:
for DIR in $PATH ; do echo $DIR ; done
IFS="$OLDIFS"
}
$> lspath | grep "/usr/dt/bin"
setPath() {
PATH=${PATH:="/sbin:/bin"};
for _DIR in "$@"
do
if [ -d "$_DIR" ] ; then
PATH="$PATH":"$_DIR" ; fi
done
export PATH
unset _DIR
}
Örnek bir çağrı:
$> setPath /sbin /usr/sbin /bin /usr/bin /usr/ccs/bin
Her argümanının bir dizin olup olmadığını kontrol eder ve bir dizin varsa PATH'ye eklenir.
Bir parametre script'e iletildiği gibi bir fonsiyona da iletilebilir.
fonksyion tanımlamak için sözdizimi:
fonksyion fonksyion_adı()
{
deyim1
deyim2
deyimN
}
Bu işlev komut satırından veya kabuk betiğinin içinde aşağıdaki şekilde çağrılır:
fonsiyon-adı arg1 arg2 arg3 argN
örnek:
$ vi pass
function demo()
{
echo "All Arguments to function demo(): $*"
echo "First argument $1"
echo "Second argument $2"
echo "Third argument $3"
return
}
# fonksyionu cağrıyoruz.
demo -f foo bar
çıktısı:
All Arguments to function demo(): -f foo bar
First argument -f
Second argument foo
Third argument bar
Örnek tanım:
function topla {
(( toplam=$1+$2 ))
return $toplam
}
fonksiyonu çağırmak:
topla 2 3
echo $?
$? son işlev çağrısından veya komut tarafından döndürülen değerdir.
C kabuğu(shell),csh, UNIX dosya sisteminde hızlı hareket etmek için üç yardımcı komut sağlar:
Bu komutlar, dahili olarak bir dizin yığınını korur ve kullanıcının yığından dizinleri ekleyip, çıkarmasına olanak tanır ve yığının içeriğini listeler.
dirs uygulaması:
dirs() {
# IFS'yi kaydedin, ardından şuna ayarlayın:
# _DIR_STACK öğelerine ayrı ayrı erişmek için.
OLDIFS="$IFS"
IFS=:
# her dizini ve ardından bir boşluk yazdır
for i in $_DIR_STACK
do
echo "$i \c“
done
# tüm girişlerden sonra yeni bir satır ekle
# _DIR_STACK yazdırıldı
echo
# IFS'yi geri yükle
IFS="$OLDIFS"
}
pushd uygulaması:
...(gelecek)
popd uygulaması:
...(gelecek)
metin veya değişken değerlerini gösterir.
echo [options] [string, değişkenler ...]
Seçenekler:
echo ile birlikte kullanılan bazı kontrol karakterleri vardır.
Bu kod, mesajı Mavi renkte yazdırır:
$> echo "\033[34m Hello Colorful World!"
Hello Colorful World!
Bu ANSI kaçış dizisini kullanır (\033[34m).
\033, kaçış karakteri, biraz harekete geçiyor
[34m kaçış kodu ön plan rengini Mavi olarak ayarlar
[ CSI'nin başlangıcıdır (Komut Dizisi Giriş).
34, parametredir.
m harfdir (eylemi belirtir).
Genel sözdizimi:
echo -e "\033[ escape-code your-message "
(Bu başlık vakit bulursam genişletilebilir...)
Komut dosyasını kabuk programına bir argüman olarak verin (ör. Bash my_script).
Veya komut dosyasında hangi kabuğun kullanılacağını belirtin.
Derleme gerekmez!
Geliştirme araçları:
Kaynak dosyalarının oluşturulması.(.c, .h, .cpp)
Text editörleri; vi ,emacs
versiyon kontrol sistemleri; rcs, cvs
Derleme (*.o) and bağlama.
Derleyiciler; gcc, g++
Otomatik yapı(building) araçları; make
Çalıştırma ve test etme(xdb,gdb)
Ayrı ayrı derleme: Herhangi bir kaynak dosyadan, daha sonra çalıştırılabilir yapmak için bağlanacak bir nesne dosyası oluşturabilirsiniz.
g++'nın kütüphaneler ve dahil edilen dosyalar için varsayılan dizinleri vardır.
Genellikle programlar aşağıdakilere dayanan koşullu parçalar içerir:
#ifdef DEBUG
printf(“value of var is %d”, var);
#endif
Önişlemci tanımlarını komut satırından ayarlayabilirsiniz:
g++ -DDEBUG -o prog prog.c
(genişletilecek...)
Çok sayıda dosya içeren orta ve büyük çaplı yazılım projelerini derlemek şu sebeblerden zor olur:
make, bu işlemleri otomatikleştirir.
Programı oluşturmak için, kurallar içeren [Mm]akefile adlı bir dosyayı okur.
# mydb için Makefile
mydb: mydb.o user.o database.o
g++ -o mydb mydb.o user.o database.o
mydb.o : mydb.cpp mydb.h
g++ -c mydb.cpp
user.o : user.cpp mydb.h
g++ -c user.cpp
database.o : database.cpp mydb.h
g++ -c database.cpp
Bağımlılık satırları:
Makefile'daki metni temsil etmek için makrolar kullanılır.
Komutlarda özel değişkenler kullanılır:
OBJS = mydb.o user.o database.o
CC = /usr/bin/g++
mydb: ${OBJS}
${CC} -o $@ $?
mydb.o: mydb.cpp mydb.h
${CC} -c $?
user.o: user.cpp mydb.h
${CC} -c $?
database.o: database.cpp mydb.h
${CC} -c $?
Yorumlar ‘#’ ile başlar
Bir satırın başına veya yorum olmayan bir satırın sonuna konulabilir.
Çok uzun olan satırlar, önceki satırın sonuna line \ koyarak bir sonraki satırda devam edebilir.
OBJS = mydb.cpp user.cpp database.cpp
CC = /usr/bin/g++
mydb: ${OBJS}
${CC} -o $@ $?
Ara dosyaları(intermediate) kaldırmanın bir yolunu dahil edin.
çoklu programlar oluşturmak için bir hedef dahil edin.
(pek yakında...)
(devamı pek yakında...)
Programlar, kütüphaneler üzerinden sistem çağrıları yapar.
4 ana sistem çağrısı kategorisi:
Arabelleksiz giriş/çıkış:
Standart giriş/çıkış:
Unix'de herşeyin bir dosya olduğunu hatırlayın ve unutmayın.
çekirdek(kernel), her süreç için açık dosyaların bir listesini tutar.
Dosyalar okuma,yazma için açılabilir.
G/Ç sistem çağrılarını kullanmak için <stdio.h> dahil edilmelidir.(include)
Not: Unix çekirdeği ile etkileşime girmek için kullanılan sistem çağrılarının bazıları diğer işletim sistemlerinde de mevcuttur. Bununla birlikte, bunlar çok farklı şekilde uygulanabilir (muhtemelen). Bazıları hiç mevcut değil.
Çoğu Unix G/Ç, 5 sistem çağrısı ile yapılabilir.
open, read, write, close, lseek
Her dosya bir dosya tanımlayıcısı tarafından referans edilir(bir tam sayı)).
Üç dosya otomatik olarak açılır:
FD 0: standart giriş
FD 1: standart çıkış
FD 2: standart hata
Yeni bir dosya açıldığı zaman, en küçük FD'ye atanır.
man -s 2
int open(char *path, int flags, mode_t mode);
path: absolute(mutlak) veya relative(göreceli) path
flags(bayraklar):
modu: eğer O_CREAT kullanıyorsanız, izinleri açıkca belirtin
Yeni atanan dosya tanımlayıcısını döndürür.
Oluşturulma izinleri:
777 vs 0777 vs 0x777
izinler:
kim(who):
fd = open(”name”, O_RDWR|O_CREAT, 0700);
fd dönen değer:
fd >= 0 – açma başarılır
fd < 0 – açma başarısız
ssize_t read(int fd, void *buf, size_t nbytes);
ssize_t write(int fd, void *buf, size_t nbytes);
bytes = read(fd, buffer, count);
Fd ile ilişkili dosyadan okur.
okunan bayt sayısını veya hata mesajı yani -1 değerini döndürür
int fd=open("someFile", O_RDONLY);
char buffer[4];
int bytes = read(fd, buffer, 4);
bytes = write(fd, buffer, count);
Fd ile ilişkili dosyaya yazar.
yazılan bayt sayısını veya hata mesajı yani -1 değerini döndürür
int fd=open("someFile", O_WRONLY);
char buffer[4];
int bytes = write(fd, buffer, 4);
#define BUFFSIZE 8192
// bu nasıl seçilir
int main(void) {
int n;
char buf[BUFFSIZE];
while ((n=read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
if (write(STDOUT_FILENO, buf, n) != n)
printf("write error");
if (n < 0)
printf("read error");
}
int close(int fd);
off_t lseek(int fd, off_t offset, int whence);
Standart girişin aranıp aranmayacağını test edelim.
int main(void) {
if (lseek(STDIN_FILENO, 0, SEEK_CUR)==-1)
printf("cannot seek\n");
else
printf("seek OK\n");
exit(0);
}
a.out < /etc/motd “seek OK ” verir.
$ cat < /etc/motd | a.out “cannot seek” verir
$ a.out < /var/spool/cron/FIFO “cannot seek” verir
char buf1[] = "abcdefghij“, buf2[] = "ABCDEFGHIJ";
int fd = creat("file.hole", FILE_MODE);
write(fd, buf1, 10);
lseek(fd, 40, SEEK_SET);
write(fd, buf2, 10);
a.out
$ ls -l file.hole boyutunu kontrol et
-rw-r--r-- 1 root 50 Jul 31 05:50 file.hole
$ od -c file.hole gerçek içeriğine bakalım
Süreç(process): Temel yürütme birimi
Süreçler ile ilgili shell komutları:
ps, top, kill, nice,...
Stdio kütüphanesi, arabellek(buffering) kullanan FILE nesneleri sağlar.
Neden arabelleğe alma? Verimlilik.
FILE nesneleri, dosya tanımlayıcıların üzerine inşa edilmiştir.
Süreç yönetimi görevleri için dosya tanımlayıcılarını kullanacağız.
Düşük seviye I / O tarafından kullanılır:
Bir tam sayı gibi tanımlanır.
Bir FILE nesnesini fd'ye dönüştürmek için kullanışlı bir sistem çağrısı.
Elbette bir dosya tanıtıcısına bir akış arayüzü atamak mümkündür.
Sistem, aşağıdakilerle ilgilenmektedir: - Bir süreç oluşturmak - Programın ayarlanması bir süreç yürütür - Bir i sonlandırılması bekleniyor
Hangi süreçlerin çalıştını görmek için: "top" , "ps -aux" komutlarını çalıştırın.
Yeni bir işlem oluşturmanın tek yolu mevcut bir işlemi kopyalamaktır. Bu nedenle tüm işlemlerin atası pid = 1 ile başlatılır.
İki olası sebep:
Bir kullanıcının oluşturabileceği maksimum işlem sayısının bir sınırı vardır.Bu sınıra ulaşıldığında (yani, işlem tablosu dolu), daha sonraki fork() çağrıları -1 değerini döndürür.
Çekirdek işlemlere sanal bellek ayırır Belleği yetersiz kaldığında, fork çağrıları başarısız olur.
Çocuk tarafından ebeveynden miras alınan özellikler:
Ebeveyn ve çocuk arasındaki farklar:
fork örneği:
int i, pid;
i = 5;
printf(“%d\n”, i);
pid = fork();
if(pid != 0)
i = 6; /* sadece parent buraya gelir /
else
i = 4; / sadece child buraya gelir */
printf(“%d\n”, i);
PID/PPID örneği:
#include <stdio.h>
#include <unistd.h>
int main(void) {
int pid;
printf("ORIG: PID=%d PPID=%d\n",getpid(), getppid());
pid = fork();
if(pid != 0)
printf("PARENT: PID=%d PPID=%d\n",getpid(), getppid());
else
printf("CHILD: PID=%d PPID=%d\n",getpid(), getppid());
return(1);
}
çıktı:
ORIG: PID=27989 PPID=27167
PARENT: PID=27989 PPID=27167
CHILD: PID=27990 PPID=27989
Örnek:
Program X:
int i = 5;
printf("%d\n", i);
exec(“Y”);
printf("%d\n", i);
Program Y:
printf("hello\n");
Yeni süreç çağrılan sürecinden aşağıdakileri miras alır:
altı versiyon exec():