├── README.md └── photos ├── bölüm-11 └── photo1.png ├── bölüm-12 ├── photo1.png ├── photo2.png ├── photo3.png ├── photo4.png ├── photo5.png └── photo6.png ├── bölüm-2 ├── photo1.png ├── photo2.png ├── photo3.png └── photo4.png ├── bölüm-6 └── photo1.png └── bölüm-9 ├── photo1.png ├── photo2.png └── photo3.png /README.md: -------------------------------------------------------------------------------- 1 | # Sistem-programlama 2 | ## İçindekiler 3 | - [Sistem-programlama](#sistem-programlama) 4 | - [İçindekiler](#%c4%b0%c3%a7indekiler) 5 | - [Bölüm-1 Giriş](#b%c3%b6l%c3%bcm-1-giri%c5%9f) 6 | - [neden Unix?](#neden-unix) 7 | - [Unix versionları](#unix-versionlar%c4%b1) 8 | - [Unix tabanlı bir sistemin katmanları](#unix-tabanl%c4%b1-bir-sistemin-katmanlar%c4%b1) 9 | - [Unix hesapları](#unix-hesaplar%c4%b1) 10 | - [Shell(kabul) nedir?](#shellkabul-nedir) 11 | - [Shell sistemi](#shell-sistemi) 12 | - [Bölüm-2 Unix dosya sistemi](#b%c3%b6l%c3%bcm-2-unix-dosya-sistemi) 13 | - [Çalışma dizini(working directory)
](#%c3%87al%c4%b1%c5%9fma-diziniworking-directory-br) 14 | - [Başlangıç(ana) Dizini(home directory)
](#ba%c5%9flang%c4%b1%c3%a7ana-dizinihome-directory-br) 15 | - [Unix Dosya Hiyerarşisi](#unix-dosya-hiyerar%c5%9fisi) 16 | - [Unix yolları (Unix paths)](#unix-yollar%c4%b1-unix-paths) 17 | - [Bazı standart dizinler](#baz%c4%b1-standart-dizinler) 18 | - [Dizin değiştirme (changing directories)
](#dizin-de%c4%9fi%c5%9ftirme-changing-directories-br) 19 | - [Dosya bilgisi (ls -al)
](#dosya-bilgisi-ls--al-br) 20 | - [Dosya türleri](#dosya-t%c3%bcrleri) 21 | - [I-nodes](#i-nodes) 22 | - [Dosya işlemleri](#dosya-i%c5%9flemleri) 23 | - [Dizin oluşturma ve silme](#dizin-olu%c5%9fturma-ve-silme) 24 | - [Links(bağlantılar) oluşturma](#linksba%c4%9flant%c4%b1lar-olu%c5%9fturma) 25 | - [Dosya sahipliği](#dosya-sahipli%c4%9fi) 26 | - [Dosya izinleri](#dosya-izinleri) 27 | - [Dosyanın içeriğine bakmak](#dosyan%c4%b1n-i%c3%a7eri%c4%9fine-bakmak) 28 | - [Wildcards(joker karakterler)(Globbing)](#wildcardsjoker-karakterlerglobbing) 29 | - [Unix komutlarında yardım almak](#unix-komutlar%c4%b1nda-yard%c4%b1m-almak) 30 | - [Diğer dosya sistemleri](#di%c4%9fer-dosya-sistemleri) 31 | - [Bölüm-3 Text Editing](#b%c3%b6l%c3%bcm-3-text-editing) 32 | - [Neden vi?](#neden-vi) 33 | - [cursor hareketi:](#cursor-hareketi) 34 | - [file operation:](#file-operation) 35 | - [arama:](#arama) 36 | - [Bölüm-4 Shell operatörleri](#b%c3%b6l%c3%bcm-4-shell-operat%c3%b6rleri) 37 | - [Üç standart dosya](#%c3%9c%c3%a7-standart-dosya) 38 | - [stdout yönlendirme](#stdout-y%c3%b6nlendirme) 39 | - [stdin yönlendirme](#stdin-y%c3%b6nlendirme) 40 | - [Standart dosya tanımlayıcıları](#standart-dosya-tan%c4%b1mlay%c4%b1c%c4%b1lar%c4%b1) 41 | - [Dosya tanımlayıcı oluşturma](#dosya-tan%c4%b1mlay%c4%b1c%c4%b1-olu%c5%9fturma) 42 | - [Dosya Tanımlayıcıları ile Yönlendirme](#dosya-tan%c4%b1mlay%c4%b1c%c4%b1lar%c4%b1-ile-y%c3%b6nlendirme) 43 | - [Genel Giriş / Çıkış Yönlendirme](#genel-giri%c5%9f--%c3%87%c4%b1k%c4%b1%c5%9f-y%c3%b6nlendirme) 44 | - [Ayrı Dosyaları Yeniden Yönlendirme](#ayr%c4%b1-dosyalar%c4%b1-yeniden-y%c3%b6nlendirme) 45 | - [Tek Bir Dosyaya Yönlendirme.](#tek-bir-dosyaya-y%c3%b6nlendirme) 46 | - [Pipes ( veri yolu)](#pipes--veri-yolu) 47 | - [Süreçler(Processes)](#s%c3%bcre%c3%a7lerprocesses) 48 | - [Filtreler ( Filters)](#filtreler--filters) 49 | - [Communication(iletişim) komutları](#communicationileti%c5%9fim-komutlar%c4%b1) 50 | - [Processes(süreçler) komutları](#processess%c3%bcre%c3%a7ler-komutlar%c4%b1) 51 | - [Daha fazla dosya sistemi komutları](#daha-fazla-dosya-sistemi-komutlar%c4%b1) 52 | - [Bölüm-5 Regular Expressions(Düzenli ifadeler)](#b%c3%b6l%c3%bcm-5-regular-expressionsd%c3%bczenli-ifadeler) 53 | - [RE kullanan UNIX Programları](#re-kullanan-unix-programlar%c4%b1) 54 | - [Temel ve Genişletilmiş RE'ler](#temel-ve-geni%c5%9fletilmi%c5%9f-reler) 55 | - [egrep kullanımı](#egrep-kullan%c4%b1m%c4%b1) 56 | - [Metacharacters (Özel karakterler)](#metacharacters-%c3%96zel-karakterler) 57 | - [Bunlar ne anlama geliyor?](#bunlar-ne-anlama-geliyor) 58 | - [Egrep ile kelime arama](#egrep-ile-kelime-arama) 59 | - [Bölüm-6 UNIX Kabuk Ortamları](#b%c3%b6l%c3%bcm-6-unix-kabuk-ortamlar%c4%b1) 60 | - [Kabuk özellikleri](#kabuk-%c3%b6zellikleri) 61 | - [Kabuk Etkileşimi](#kabuk-etkile%c5%9fimi) 62 | - [Kabuk Programlama](#kabuk-programlama) 63 | - [Çeşitli Unix Kabukları](#%c3%87e%c5%9fitli-unix-kabuklar%c4%b1) 64 | - [Kabuk Özellikleri.](#kabuk-%c3%96zellikleri) 65 | - [Bourne Again SHell (bash)](#bourne-again-shell-bash) 66 | - [Değişkenler](#de%c4%9fi%c5%9fkenler) 67 | - [Kabuk Değişkenleri](#kabuk-de%c4%9fi%c5%9fkenleri) 68 | - [Ortam Değişkenleri](#ortam-de%c4%9fi%c5%9fkenleri) 69 | - [Değişkenlere atama](#de%c4%9fi%c5%9fkenlere-atama) 70 | - [Metin Tamamlama](#metin-tamamlama) 71 | - [Aliases (Takma adlar)](#aliases-takma-adlar) 72 | - [Komuta Tarihi(geçmişi)](#komuta-tarihige%c3%a7mi%c5%9fi) 73 | - [Komut Satırında Düzenleme](#komut-sat%c4%b1r%c4%b1nda-d%c3%bczenleme) 74 | - [Login(giriş) Script'leri](#logingiri%c5%9f-scriptleri) 75 | - [Bölüm-7 Temel Kabuk Betiği (basic shell script)](#b%c3%b6l%c3%bcm-7-temel-kabuk-beti%c4%9fi-basic-shell-script) 76 | - [Komut dosyası yürütme (Script Execution)](#komut-dosyas%c4%b1-y%c3%bcr%c3%bctme-script-execution) 77 | - [Kabuk Değişkenleri](#kabuk-de%c4%9fi%c5%9fkenleri-1) 78 | - [Dize(string) Değişkenleri](#dizestring-de%c4%9fi%c5%9fkenleri) 79 | - [Dizi Değişkenleri](#dizi-de%c4%9fi%c5%9fkenleri) 80 | - [Dışa aktarılan değişkenler](#d%c4%b1%c5%9fa-aktar%c4%b1lan-de%c4%9fi%c5%9fkenler) 81 | - [Komut Satırı Argümanları](#komut-sat%c4%b1r%c4%b1-arg%c3%bcmanlar%c4%b1) 82 | - [Çıktı ve alıntılama(quoting)](#%c3%87%c4%b1kt%c4%b1-ve-al%c4%b1nt%c4%b1lamaquoting) 83 | - [Dönüş değerleri(Return values)](#d%c3%b6n%c3%bc%c5%9f-de%c4%9ferlerireturn-values) 84 | - [Kullanıcı tanımlı değişkenler](#kullan%c4%b1c%c4%b1-tan%c4%b1ml%c4%b1-de%c4%9fi%c5%9fkenler) 85 | - [Kullanıcı Girişi Okuma](#kullan%c4%b1c%c4%b1-giri%c5%9fi-okuma) 86 | - [Komut ve Aritmetik yerdeğiştirme](#komut-ve-aritmetik-yerde%c4%9fi%c5%9ftirme) 87 | - [Tamsayılı(integer) Aritmetik](#tamsay%c4%b1l%c4%b1integer-aritmetik) 88 | - [expr(ifade) komutu](#exprifade-komutu) 89 | - [Önceden Tanımlanmış Değişkenler](#%c3%96nceden-tan%c4%b1mlanm%c4%b1%c5%9f-de%c4%9fi%c5%9fkenler) 90 | - [Argümanları komut dosyalarına geçirme](#arg%c3%bcmanlar%c4%b1-komut-dosyalar%c4%b1na-ge%c3%a7irme) 91 | - [shift komutu](#shift-komutu) 92 | - [Null komutu](#null-komutu) 93 | - [&& ve || operatörleri](#ve--operat%c3%b6rleri) 94 | - [Koşullu İfadeler](#ko%c5%9fullu-%c4%b0fadeler) 95 | - [İf deyimi](#%c4%b0f-deyimi) 96 | - [test komutu](#test-komutu) 97 | - [Test komutuyla kullanılan Mantıksal Operatörler:](#test-komutuyla-kullan%c4%b1lan-mant%c4%b1ksal-operat%c3%b6rler) 98 | - [durum(case) açıklamaları](#durumcase-a%c3%a7%c4%b1klamalar%c4%b1) 99 | - [for döngüsü](#for-d%c3%b6ng%c3%bcs%c3%bc) 100 | - [While döngüsü](#while-d%c3%b6ng%c3%bcs%c3%bc) 101 | - [Until döngüsü](#until-d%c3%b6ng%c3%bcs%c3%bc) 102 | - [eval komutu](#eval-komutu) 103 | - [Bölüm-8 Gelişmiş Kabuk Betiği(Advanced Shell Scripting )](#b%c3%b6l%c3%bcm-8-geli%c5%9fmi%c5%9f-kabuk-beti%c4%9fiadvanced-shell-scripting) 104 | - [Fonksiyon oluşturma ve kullanma](#fonksiyon-olu%c5%9fturma-ve-kullanma) 105 | - [Fonsiyona parametre verme](#fonsiyona-parametre-verme) 106 | - [Değer döndürme(return)](#de%c4%9fer-d%c3%b6nd%c3%bcrmereturn) 107 | - [Fonksiyonlar arasında veri paylaşımı](#fonksiyonlar-aras%c4%b1nda-veri-payla%c5%9f%c4%b1m%c4%b1) 108 | - [echo komutu](#echo-komutu) 109 | - [renkli metin gösterme](#renkli-metin-g%c3%b6sterme) 110 | - [Komut dosyası yürütme(script execution)](#komut-dosyas%c4%b1-y%c3%bcr%c3%bctmescript-execution) 111 | - [Bölüm-9 Yazılım Geliştirme: g++ ve make](#b%c3%b6l%c3%bcm-9-yaz%c4%b1l%c4%b1m-geli%c5%9ftirme-g-ve-make) 112 | - [Yazılım geliştirme süreçi](#yaz%c4%b1l%c4%b1m-geli%c5%9ftirme-s%c3%bcre%c3%a7i) 113 | - [Derleme şüreci](#derleme-%c5%9f%c3%bcreci) 114 | - [Temel g++ Örnekleri](#temel-g-%c3%96rnekleri) 115 | - [g++ seçenekleri](#g-se%c3%a7enekleri) 116 | - [g++ 'da tanımlar](#g-da-tan%c4%b1mlar) 117 | - [Derlemede'de make kullanımı](#derlemedede-make-kullan%c4%b1m%c4%b1) 118 | - [make'in temek işlemleri](#makein-temek-i%c5%9flemleri) 119 | - [Temel Makefile Örnekleri](#temel-makefile-%c3%96rnekleri) 120 | - [Bir Makefile'ın parçaları](#bir-makefile%c4%b1n-par%c3%a7alar%c4%b1) 121 | - [Makrolar(macros) ve özel değişkenler](#makrolarmacros-ve-%c3%b6zel-de%c4%9fi%c5%9fkenler) 122 | - [örneği basitleştirme](#%c3%b6rne%c4%9fi-basitle%c5%9ftirme) 123 | - [Make'i cağırmak (invoking make)](#makei-ca%c4%9f%c4%b1rmak-invoking-make) 124 | - [Diğer Makefile Notları ve Son ek(suffix) kuralları](#di%c4%9fer-makefile-notlar%c4%b1-ve-son-eksuffix-kurallar%c4%b1) 125 | - [En Basit Makefile Örneği](#en-basit-makefile-%c3%96rne%c4%9fi) 126 | - [Diğer Faydalı Makefile İpuçları](#di%c4%9fer-faydal%c4%b1-makefile-%c4%b0pu%c3%a7lar%c4%b1) 127 | - [Bölüm-10 Hata ayıklama (Debugging)](#b%c3%b6l%c3%bcm-10-hata-ay%c4%b1klama-debugging) 128 | - [Bölüm-11 Dosya yönetimi (File Management)](#b%c3%b6l%c3%bcm-11-dosya-y%c3%b6netimi-file-management) 129 | - [Sistem Çağrıları](#sistem-%c3%87a%c4%9fr%c4%b1lar%c4%b1) 130 | - [Program yürütmek](#program-y%c3%bcr%c3%bctmek) 131 | - [C'ye karşı C++](#cye-kar%c5%9f%c4%b1-c) 132 | - [Arabelleksiz(unbeffered) G/Ç vs. Standart G/Ç](#arabelleksizunbeffered-g%c3%87-vs-standart-g%c3%87) 133 | - [Temel Dosya G/Ç](#temel-dosya-g%c3%87) 134 | - [open()](#open) 135 | - [read() ve write()](#read-ve-write) 136 | - [read() örneği](#read-%c3%b6rne%c4%9fi) 137 | - [write() örneği](#write-%c3%b6rne%c4%9fi) 138 | - [stdin'i stdout'a kopyalamak](#stdini-stdouta-kopyalamak) 139 | - [close()](#close) 140 | - [lseek()](#lseek) 141 | - [lseek() örnekler](#lseek-%c3%b6rnekler) 142 | - [Bölüm-12 Süreç Yönetimi (Process Management)](#b%c3%b6l%c3%bcm-12-s%c3%bcre%c3%a7-y%c3%b6netimi-process-management) 143 | - [Unix'te süreçler](#unixte-s%c3%bcre%c3%a7ler) 144 | - [süreç belirtmek](#s%c3%bcre%c3%a7-belirtmek) 145 | - [Dosya Nesneleri ve Dosya Tanımlayıcıları](#dosya-nesneleri-ve-dosya-tan%c4%b1mlay%c4%b1c%c4%b1lar%c4%b1) 146 | - [Ara belleğe alma(Buffering)](#ara-belle%c4%9fe-almabuffering) 147 | - [Dosya tanımlayıcıları](#dosya-tan%c4%b1mlay%c4%b1c%c4%b1lar%c4%b1) 148 | - [Süreç Yönetimi Sorunları](#s%c3%bcre%c3%a7-y%c3%b6netimi-sorunlar%c4%b1) 149 | - [Unix'i başlatma](#unixi-ba%c5%9flatma) 150 | - [Csh komutları nasıl çalıştırır?](#csh-komutlar%c4%b1-nas%c4%b1l-%c3%a7al%c4%b1%c5%9ft%c4%b1r%c4%b1r) 151 | - [Süreç oluşturma](#s%c3%bcre%c3%a7-olu%c5%9fturma) 152 | - [Fork : PID'ler ve PPID'ler](#fork--pidler-ve-ppidler) 153 | - [fork() başarısız olduğunda](#fork-ba%c5%9far%c4%b1s%c4%b1z-oldu%c4%9funda) 154 | - [fork () özellikleri](#fork--%c3%b6zellikleri) 155 | - [Program Yürütme (Executing a Program)](#program-y%c3%bcr%c3%bctme-executing-a-program) 156 | - [exec() özellikleri](#exec-%c3%b6zellikleri) 157 | ## Bölüm-1 Giriş 158 | ### neden Unix? 159 | modern bir işletim sistemi; 160 | - stable : kararlı, kullanıcı ne kadar zorlasada hata yapmaya yönelik bundan etkilenmez. 161 | - flexible : kullanıcı kendine çalışabilir bir alan oluşturabilir. 162 | - configurable : yapılandırılabilir. 163 | - allows multiple users and programs 164 | - Birçok bilimsel ve endüstriyel ortamda kullanılır 165 | - Çok sayıda özgür ve iyi yazılmış yazılım programı 166 | - Açık kaynaklı işletim sistemi (OS) 167 | - Mükemmel programlama ortamı 168 | - Büyük ölçüde donanımdan bağımsız 169 | - Standartlara dayalı 170 | - İnternet sunucuları ve Unix’te çalışan servisler (Dünyadaki web sunucularının yaklaşık% 65’i Apache çalıştıran Linux / Unix makineleridir) 171 | 172 | ### Unix versionları 173 | iki ana gelişim kolu vardır. 174 | Two main threads of development: 175 | - Berkeley software distribution (BSD) (http://www.bsd.org) 176 | - Unix System Laboratories (http://www.unix.org)
177 | BSD: SunOS 4, Ultrix, BSDI, OS X, NetBSD, FreeBSD, OpenBSD, Linux (GNU)
178 | SYS V: System V (AT&T -> Novell -> SCO), Solaris (SunOS 5), HP-UX (Hewlett-Packard), AIX 179 | 180 | ### Unix tabanlı bir sistemin katmanları 181 | 182 | - işletim sistemi kernel modda çalışır, sistem çağrıları kernel moddadır.(sistem çağrısı: sistemin kaynağı kullanmak istemesi.) 183 | - Standart Library, sistem çağrısı doğrudanda kullanılabilir, kütüphane çağrısı olarakta kullanılabilir. 184 | - user mode , Bellek ve işletim sistemi üzerinde işlemler yapar.( kullanıcı seviyesinde printf("A") yazıldığında burda printf bir library function'dur, write(1,"A",1) şeklinde sistem çağrısı yapılır .) 185 | - shell , kullanıcı komutlarını kabul eder ve bunları yerine getirmekle sorumludur. 186 | - Unix sistemi ile birlikte dört yüzün üzerinde faydalı program veya araç sunulmaktadır. Bu yardımcı programlar (veya komutlar) dosya kopyalama, metin düzenleme, hesaplama yapma ve yazılım geliştirme gibi çeşitli görevleri destekler. 187 | 188 | ### Unix hesapları 189 | Bir Unix makinesine giriş yapmak o sistem için bir hesap gerektirir. 190 | Bir kullanıcı hesabı giriş ve şifre ile ilişkilendirilmiştir. 191 | “login” kullanıcı adınızdır, şifreniz siz yazarken gösterilmez.(login shell kullanıcıya hizmet veren ilk shell'dir) 192 | 193 | 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 194 | süreç oluşturur süreç kendisini iki parçaya böler(parent,child). 195 | 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. 196 | 197 | ### Shell(kabul) nedir? 198 | Sadece giriş yaptığınızda bir Unix programı çalıştırılabilir. 199 | Bir komut yorumlayıcısıdır. 200 |  - UNIX yardımcı programlarına temel kullanıcı arabirimini sağlar. 201 | Bir programlama dilidir. 202 |   -kabuk komutlarından oluşan program kabuk komut dosyası olarak adlandırılır. 203 | Komutları bir dosyaya koyabilir ve çalıştırabilirsiniz 204 | 205 | ### Shell sistemi 206 | 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. 207 | Komut satırında yazdıklarımızı bir dosya içerisine yazarak hepsini icra edebiliriz bu dosya scriptfile dosyası olmuş olur. 208 | 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. 209 | Dosyanın hangi shell ile koşacağını belirtmek için; 210 | - #!/bin/bash 211 | 212 | \#!: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. 213 | 214 | /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. 215 | 216 | - \# ifadesiyle başlayan satırlar yorum satırlarıdır. 217 | 218 | 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ı) 219 | 220 | shell(kabuk), Unix sistemine komut göndermek için kullandığınız programdır. Bazı komutlar tek bir kelimedir.örneğin; 221 | - who komutu 222 | 223 | Bu komutla o anki kullancı detaylarını görebiliriz. aynı şekilde whoami komutu ile o anki kullanıcının adını görebiliriz 224 | w komutu ilede login olmuş kullanıcıları görebiliriz. 225 | 226 | - date komutu 227 | 228 | Bu komutla terminal ekranında sistem tarih ve saat bilgilerini görebiliriz. 229 | 230 | - ls komutu 231 | 232 | bulunduğumuz directory(dizin)'deki dosyaları listeler 233 | 234 | - $> komut argüman1 argüman2 235 | 236 | argümanlarla komuş işlemini değiştirebiliyoruz, daha detaylı listeleme gibi örneğin; 237 | - ls -l 238 | - ls -a 239 | - ls -la 240 | - ls -a;ls -l 241 | - ls -F 242 | - ls -al textfile1 243 | - ls -al textfile1 textfile2 244 | - ls -al directory 245 | 246 | 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. 247 | ls -a komutu gizli dosya ve dizinleri görebiliriz.
248 | ls -la veya ls -al komutuylada ls -l ve ls -a komutlarını beraber kullanabiliriz.
249 | ls -a;ls -l şeklinde de iki komut calıştırılabilir.
250 | ls bin komutuda bin klasöründekileri listeler
251 | ls textfile1 textfile2 yazarsakta bu dosyaları listeler. 252 | 253 | Bir komut satırında komut icra ettiğinzde sistem komutu veya programı ise;
254 | 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. 255 | 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. 256 | 257 | Komut satırı tepki vermiyorsa bir işlemi icra ediyor ve bir problem olmuş olabilir. 258 | - ctrl + c 259 | 260 | kesme gönderir, süreci keser. 261 | 262 | - ctrl + z 263 | 264 | sürecin icrasını durdurur. 265 | 266 | - ps 267 | 268 | 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. 269 | 270 | - fg ve bg 271 | 272 | 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. 273 | 274 | 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. 275 | 276 | - ctrl + d ve exit 277 | 278 | terminali kapatır(logout). 279 | 280 | 281 | ## Bölüm-2 Unix dosya sistemi 282 | 283 | 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.
284 | Unix'de herşey bir dosyadır.(porgramlar, text dosyaları, çevre birimleri, terminaller...)
285 | Dizinler diğer dosyaları içeren(referanslara) bir dosyadır.
286 | Unix'de sürücü harfleri yoktur.Dosya sistemi, depolama aygıtlarına mantıksal bir görünüm sağlar.
287 | 288 | ### Çalışma dizini(working directory)
289 | Çalışma dizini: dosya sisteminin geçerli konumu yani sistemdeki konumunuz. 290 | - pwd komutu
291 | 292 | pwd (print working directory) komutu çalışma dizininizin mutlak yolunu (daha sonra) verir. 293 | Başka bir dizin belirtmediğiniz sürece, bir komut çalışma dizini içerisinde çalışmak istediğinizi varsayar. 294 | 295 | ### Başlangıç(ana) Dizini(home directory)
296 | Ana dizin: kişisel kullanıcı alanı. 297 | Oturum açıldığında, çalışma dizininiz ana dizininize ayarlanacaktır. 298 | Ana dizininize giden yol, ~ (tilde) sembolüyle belirtilebilir. 299 | Kullanıcı1'in ana dizini ~ kullanıcı1 şeklinde belirtilebilir. 300 | Başka bir dizindeysek cd ~/ komutunu vererek ana dizine gidebiliriz. 301 | 302 | ### Unix Dosya Hiyerarşisi 303 | 304 | ![foto1](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-2/photo1.png) 305 | 306 | Kök dizini(Root directory) : / , bütün dosyalar root'a bağlanır. 307 | Dizinler düz dosyalar veya başka dizinler içerebilir. 308 | Sonuç, dosya sistemi bir ağaç yapısıdır. 309 | Unix, herhangi özel bir dosya adı uzantısını tanımıyor. 310 | 311 | ### Unix yolları (Unix paths) 312 | 313 | Dizinler / ile ayrılır. 314 | Absolute path(tam yol): Root(kök)'dan başlayarak ağacın takip edildiği yoldur.Örneğin:
315 | /home/user1/textfile
316 | ~user1/textfile
317 | ~/textfile
318 | Absolute path kullanıcı dizini referans alınarak bildirim yapar. 319 | 320 | Relative path(göreceli yol): çalışma dizininden başlar.
321 | - .. bir üst dizindir(parent) 322 | - . çalışma dizinidir(yani dizinin kendisini ifade eder. 323 | 324 | textfile
325 | bil318/lec1.txt
326 | çalışma dizinini referans alma : ./../textfile
327 | parent'ı referans alma : ../textfile
328 | 329 | ### Bazı standart dizinler 330 | 331 | Bu dizinler / yani root altındadır.
332 | / bin - standart komutlar ve yardımcı programlar; yürütülebilir.Kullanıcının koşabildiği tüm programlar bu dizindedir.
333 | / sbin - root tarafından icra edilebilen programlar, sistem komutları ve yardımcı programları (önyükleme için gerekli) bulunur
334 | / 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
335 | / etc - ana bilgisayara özgü yapılandırma; host hizmetleri
336 | / home - kullanıcıların ana dizinleri.Kullanıcının login ismiyle dizinler açılır (home/hakan)
337 | / lib - çeşitli diller için kütüphane dizini.(.so unix dosyaları , .dll windows dosyaları)
338 | / tmp - geçici dosyalar.(veritabanında taplo update ,update set işlemlerinde tmp kullanılır)
339 | / usr - kullanıcı yardımcı programları ve uygulamaları; / Usr / local /. Kurulumda değil daha sonra sisteme dahil olan programlardır olsada olur olmasada.
340 | / 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) 341 | 342 | 343 | ### Dizin değiştirme (changing directories)
344 | 345 | - cd komutu
346 | 347 | Çalışma dizinini değiştirmek için kullanılır. cd \ şeklinde kullanılır. Absolute veya relative yollar kullanılabilir.
348 | 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.
349 | cd /home/user1
350 | cd ../../user1 351 | 352 | ### Dosya bilgisi (ls -al)
353 | 354 | ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-2/photo2.png) 355 | 356 | ### Dosya türleri 357 | 358 | Plain (düz) (-): çoğu dosya bu türdedir, ikili(binary) veya metin dosyaları.
359 | Directory (dizin) (d): bir dosya kümesini gösterir
360 | Symbolic (sembolik) link (l): Başka bir dosya veya dizine işaretçi(pointer).
361 | Özel dosyalar;
362 |        Karakter cihazı (c): klavye, yazıcı, joystick.
363 |        Block cihazı (b): disk, CD-ROM.
364 | İletişim dosyaları;
365 |        FIFO (p): geçici bir depolama cihazı (sıra).
366 |        Soket (ler): soket dosyaları
367 | 368 | - ls -F komutu 369 | 370 | 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.
371 | 372 | (boş): Normal dosya
373 | *:   Yürütülebilir program veya komut dosyası
374 | /:   Dizin
375 | @ :   Sembolik bağlantı
376 | | :   FIFO (named pipe) 377 | =:   Soket
378 | 379 | -ls -i komutu 380 | 381 | ls -i komutu her dosya için i-node numarasını yazdırır. 382 | 383 | ### I-nodes 384 | 385 | Dosya sistemindeki her nesne için yönetim bilgisidir. 386 | İnode'lar diskte bulunur ve isimleri yoktur. Bunun yerine, inode dizisindeki pozisyonlarını belirten endekslere (sayılara) sahiptirler.
387 | Her inode genellikle şunları içerir: 388 | 389 | - Varsa, öğenin içeriğinin diskteki konumu 390 | - Öğenin türü (örneğin, dosya, dizin, sembolik bağlantı) 391 | - Varsa, öğenin bayt cinsinden boyutu 392 | - Dosyanın inode'unun en son değiştirildiği saat (ctime) 393 | - Dosyanın içeriğinin en son değiştirildiği saat (saat) 394 | - Dosyanın en son erişildiği zaman (atime), okuma, yürütme vb. 395 | - Referans sayısı: Dosyanın sahip olduğu adların sayısı 396 | - Dosyanın sahibi (bir UID) 397 | - Dosyanın grubu (bir GID) 398 | - Dosyanın mod bitleri (ayrıca dosya izinleri veya izin bitleri olarak da bilinir) 399 | 400 | (inode yapısı cizilebilir) 401 | 402 | ### Dosya işlemleri 403 | 404 | - touch komutu 405 | 406 | touch komutu ile dosya oluşturulur veya oluşturulmuş dosyanın son değiştirilme tarihi değiştirilir.
407 | 408 | - mv 409 | 410 | 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.
411 | 412 | - mv 413 | 414 | mv komutunun ikinci parametresine dizin verirsek , birinci parametredeki dosyayı bu dizine taşır.
415 | 416 | - mv 417 | 418 | 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.
419 | 420 | 421 | - cp [||] komutu 422 | 423 | 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.
424 | 425 | - rm [-i] 426 | 427 | 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. 428 | 429 | ### Dizin oluşturma ve silme 430 | 431 | - mkdir komutu 432 | 433 | Geçerli dizinin altında yeni bir dizin oluşturur. 434 | 435 | - rmdir komutu 436 | 437 | sadece boş dizini silebilir. 438 | 439 | - rm -r komutu 440 | 441 | 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. 442 | 443 | ### Links(bağlantılar) oluşturma 444 | 445 | - ln –s komutu 446 | 447 | sembolik bir bağ (-s) oluşturur.
448 | link_name, başka bir dizinde veya başka bir fiziksel makinede bulunabilecek varolan dosyanın bir göstergesidir.
449 | 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.
450 | 451 | ![foto3](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-2/photo3.png) 452 | 453 | 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.
454 | 455 | 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.
456 | 457 | 458 | 459 | ### Dosya sahipliği 460 | 461 | Her dosyanın tek bir sahibi var.
462 | chown komutu sahibini değiştirmek için kullanılabilir; genellikle sadece root bu komutu kullanabilir.
463 | Her dosya aynı zamanda tek bir gruba aittir.
464 | Gruplar herkesten farklı izinlere sahip olabilir.
465 | 466 | ### Dosya izinleri 467 | 468 | Dosyalara veya dizinlere erişime izin vermek veya vermemek için kullanılan izinler aşağıdaki gibidir;
469 | Üç tür izin vardır :
470 | - Oku (r) 471 | - Yaz (w) 472 | - Yürüt (x) (örneğin dosyalarda arama yapmak) 473 | 474 | İzinler üç düzeyde verilebilir:
475 | - Kullanıcı (u) 476 | - Grup (g) 477 | - Diğer (o) 478 | 479 | - chmod komutu 480 | 481 | ![foto4](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-2/photo4.png) 482 | 483 | 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;
484 | Daha çok kullanılan sayılar kullanılarak verilen izinlerdir sayılar belirli bir düzene göre verilebilir; 485 | - r=4 w=2 x=1 486 | 487 | chmod 200 a.txt yazarsak a dosyasında kullanıcıya sadece yazma hakkı verilir, grup ve diğer(herkese) herhangi bir yetki verilmez.
488 | 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.
489 | ikinci kullanım şeklinde grup için g,kullanıcı için u, digerleri icin o harfleri kullanılır.
490 | chmod g-r a.txt yazarsak gruplardan okuma yetkisini alır veya benzer şekilde g+rw yazarsak gruplara okuma yazma yetkisi veririz.
491 | 492 | - chgrp komutu 493 | 494 | chgrp asd a.txt yazarak a.txt dosyasının grubunu değiştirerek asd grubuna alabiliriz. 495 | 496 | - chown komutu 497 | 498 | chown hkn a.txt yazarak a.txt dosyasını başka bir kullanıcıdan alıp hkn kullanıcısına verebiliriz. 499 | 500 | 501 | ### Dosyanın içeriğine bakmak 502 | 503 | - cat komutu 504 | 505 | cat komutunu dosyaların içeriğine bakmak veya içeriğini değiştirmek için kullanılır.
506 | 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. 507 | 508 | - more komutu 509 | 510 | 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. 511 | 512 | Herhangi bir satır numarasından itibaren veri çekme işlemi;
513 | more +satir_numarası dosya_adi şeklinde olmaktadır. 514 | 515 | Belirli bir kelime ile başlayan satırı içeren kısımdan itibaren veri çekme işlemi;
516 | more +/"kelime" dosya_adi şeklinde olmaktadır. 517 | 518 | 519 | - less komutu 520 | 521 | "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. 522 | 523 | 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.
524 | "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. 525 | 526 | 527 | ### Wildcards(joker karakterler)(Globbing) 528 | 529 | 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.
530 | 531 | cp ~/workspace/*.cfg ~/workspace2 532 | 533 | - *Bütün karakterler, çoğul seçim 534 | - ? Herhangi bir karakter, tekil seçim 535 | - [karakterler] Karakter kümesi, veya operatörü ile çalışır. 536 | - [!karakterler] Karakter kümesi haricinde demektir. 537 | - [[:sınıf:]] Belirtilen bir karakter sınıfına ait olan eşleşme. Karakter sınıfları bir sonraki tabloda anlatılmaktadır. 538 | 539 | örnekler;
540 | 541 | *.cfg -> Sonu .cfg ile biten dosyalar 542 | 543 | A*.cfg -> A ile başlayan Sonu .cfg ile biten dosyalar 544 | 545 | ???.txt-> 3 harfli olup sonu .txt ile biten dosyalar 546 | 547 | [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. 548 | 549 | Version.[:digit:] [:digit:] -> Version.rakam rakam formatındaki dosyalar 550 | 551 | *[[:upper:]] -> Sonu buyuk harfli biten dosyalar 552 | 553 | ### Unix komutlarında yardım almak 554 | 555 | - man komutu 556 | 557 | Bu komut ile herhangi bir komut hakkında detaylı bir dökümana erişebiliyoruz. Komutun tüm belgelerini gösterir. 558 | 559 | - apropos komutu 560 | 561 | Belirtilen anahtar kelimeyle birlikte komutların tümünü açıklamalarında gösterir. apropos yerine man -k 'da kullanılabilir. 562 | 563 | - type 564 | 565 | komutun sistem yolunu verir. 566 | 567 | ### Diğer dosya sistemleri 568 | 569 | SunOS'ta 3 farklı dosya sistemi vardır 570 | 571 | - Disk tabanlı 572 | - Dağıtılmış 573 | - Sözde(pseudo) 574 | 575 | Disk tabanlı dosya sistemleri sabit diskler, CDROM'lar, disketler içerir.
576 | Dağıtılmış dosya sistemleri ağ kaynaklarını yönetir.
577 | Sözde dosya sistemleri bellek tabanlıdır ve disk alanı kullanmaz
578 | 579 | 580 | 581 | ## Bölüm-3 Text Editing 582 | 583 | Şimdiye kadar dosya sistemindeki dosyaları değiştirdik (cp, mv, rm, ln) ve içeriğini (cat, daha az) görüntüledik.
584 | Dosyaların içeriğini nasıl düzenlersiniz? 585 | Unix editörleri düz ASCII metin dosyalarıyla çalışır: vi, emacs, pico. 586 | 587 | ### Neden vi? 588 | Kullanılabilirlik 589 | - Herhangi bir Unix / Linux sisteminde çalışabilir. 590 | 591 | Komutlar anahtarlardır. 592 | 593 | - Uzaktan oturum açma yoluyla erişilebilir (ör. Ssh). 594 | - Fare kullanımını önler. 595 | 596 | Basit ve güçlü bir metin editörü. 597 | 598 | viden baska emacs,pico gibi editörlerde vardır 599 | vi uzakdan erişim ile teriminale bağlanabilir. 600 | 601 | - vi yazarak editörü açabiliriz 602 | - :help yazarak vi editörü hakkında detaylı bir bilgiye ulaşabiliriz 603 | - :q! ile çıkabiliriz 604 | - vi deneme.txt diyerek bir deneme dosyasını editörde açabiliriz.
605 | 606 | iki modu vardır. 607 | - 1. command modu: komutlar icra edilir. ilk açıldığında bu moddadır 608 | - 2. insert modu: dosya iceriği düzenlemesi yapılır. esc'ye basınca komut moduna geceriz. 609 | 610 | üç komut modu var biri normal, ikincisi :'dan sonraki komutu, üçüncüsü i modu yani yazma modu 611 | - escape tuşu ile geri gelebiliriz 612 | 613 | insert modunda(i'e basınca) backspace ile silebiliriz ama insert modunun dışında x ile veya shift-x ilede silebiliriz. 614 | shift+c alt satırla üst satırı birleştirir 615 | 616 | ### cursor hareketi: 617 | yön tuşları veya h sol j asağı k yukarı l ise sağ yönde hareket etmemizi sağlar
618 | 4j yazınca 4 satır aşağıya gider
619 | CTRL-F sonraki sayfa
620 | u (undo) yazarsak son değişikliği iptal eder
621 | :7 yazarsak direk 7.satıra gider
622 | x cursorun üzerinde olduğu karekteri siler.(imlecin üzerindeki karekteri)
623 | dd , D yazarsak cursorun üzerinde olduğu satırı siler
624 | cc ,C cursor üzerinde oldugu kelimeyi değiştirir
625 | rx karakteri x ile yer değiştirir
626 | yy bir satırın kopyasını alır
627 | p yapıstırır
628 | j üzerinde bulundugu satır ve alt satırı birleştirir.
629 | /bil yazarsak ilk bil yazan yeri bulur //bil ikinci bil yazan yeri bulur
630 | ?bil yazarsak bu sefer yukarıya doğru arar
631 | 632 | ### file operation: 633 | wq write quit (kaydeder ve çıkar)
634 | w sadece write
635 | w filename dosyaya yaz
636 | q! değişiklik olsa bile değiştirmeden çıkabilirz
637 | e filename editöre dosyayı yükle
638 | r filename cursor'ın oldugu satırdan itibaren dosyanın oldugu satıra ekle
639 | en son :W yazarsak dosyayı yazar :w! yazarsak üzerine yazar
640 | :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
641 | daha fazla detay için :help dışında http://www.belgeler.org/lis/archive-tlkg-lis-7.2.html kullanılabilir.
642 | 643 | ### arama: 644 | /kelime ileri doğru ara
645 | ?kelime geri doğru ara
646 | n son aranan tekrar
647 | N son aranan tersi yönde tekrar
648 | 649 | 650 | 651 | ## Bölüm-4 Shell operatörleri 652 | 653 | ### Üç standart dosya 654 | 655 | - stdin , standart giriş 656 | 657 | giriş karakter akışı, varsayılan giriş klavye'dir. 658 | 659 | - stdout , standart çıkış 660 | 661 | çıkış karakter akışı, varsayılan çıkış terminaldir. 662 | 663 | - stderr , standart hata(error) 664 | 665 | hata mesajlarını alır, varsayılan olarak terminal ayarlıdır. 666 | 667 | ### stdout yönlendirme 668 | 669 | stdout'u terminale yönlendirmek yerine bir programı bir dosyaya yazmasını söyleyebilirsiniz.
670 | \>filename : stdout'u bir dosyaya yönlendirir.Eğer dosya yoksa dosyayı oluşturur.Eğer dosya varsa dosyayı sıfırlar.
671 | \>>filename : varolan bir dosyaya stdout ekler. örneğin;
672 | man ls > ls_help.txt (man ls komutunun cıktısını terminale yazdırmak yerine belirlenen dosyaya yazar)
673 | echo $PWD > current_directory
674 | cat file1 >> file2 (file1 dosyasını file2ye yazar ama file2deki mevcut bilgiyi korur üstüne yazmaz dosyanın devamına yazar.) 675 | 676 | ### stdin yönlendirme 677 | 678 | stdin'in terminalden okumak yerine bir dosyadan okumasını söyleyebiliriz.
679 | 680 | < 681 | mail user@domain.com < message.txt
682 | at 3am < cmds or at 0945 < cmds
683 | sort < friends > sorted_friends
684 | 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)
685 | 686 | ### Standart dosya tanımlayıcıları 687 | 688 | Bir dosya bir tanımlayıcı ile ilişkilendirilebilir.
689 | Kabuk(shell), sırasıyla her bir komut için üç standart dosyayı üç standart dosya tanımlayıcısı ile ilişkilendirir.
690 | - 0 : standard input (STDIN) 691 | - 1 : standard output (STDOUT) 692 | - 2 : standard error (STDERR) 693 | 694 | Standart tanımlayıcılar, kullanıcının terminali ile ilişkilendirilir, ancak başka dosyalara da yönlendirilebilirler. 695 | 696 | ### Dosya tanımlayıcı oluşturma 697 | 698 | Yazmak üzere bir dosyayı açmak için bunlardan birini kullanın.
699 | 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.
700 | exec n>> filename (sonundan itibaren yazmak üzere n oluşturuluyor)
701 | n bir tamsayıdır ve dosya adı, yazmak için açılan dosyanın adıdır.
702 | İlk form, eğer böyle bir dosya varsa, belirtilen dosyanın üzerine yazar.
703 | İkinci form belirtilen dosya adına eklenir.
704 | Bir dosyayı okumak üzere açmak için
705 | exec n 706 | Hem okuma hem de yazma için bir dosyayı açmak için
707 | exec n<> filename (n adında dosya tanımlayıcısı oluşturuluru)
708 | 709 | ### Dosya Tanımlayıcıları ile Yönlendirme 710 | 711 | Standart çıktıyı, dosya tanıtıcısı n ile ilişkilendirilmiş dosyaya yönlendirmek için,
712 | komut>& n (n bağlı olduğu dosyaya yazıyor, terminalde yazılacak veri n'nin bağlı olduğu dosyaya yazılır)
713 | Standart girişi, dosya tanımlayıcısı n ile ilişkilendirilmiş dosyadan yönlendirmek için,
714 | komut<&n (komut bilmez veriyi nereden aldığını)
715 | exec n> & -: çıktı dosyası tanımlayıcısı n kapalı. 716 |     exec 1>&- , exec>&-: standart çıkış kapalı. 717 | exec n <& -: giriş dosyası tanımlayıcısı n kapalı. 718 |     exec 0<&- , exec<&-: standart giriş kapalı. 719 | 720 | 721 | Bir dosyaya yazma;
722 | exec 4> dosya ("dosya" yı açın, fd 4 atayın.)
723 | ls> & 4 (ls çıktısını "dosya" ya yaz)
724 | 725 | Bir dosyadan okuma
726 | exec 5 727 | wc <& 5 ("dosya" dan giriş oku)
728 | 729 | Bir dosyada belirtilen bir yere yazma
730 | echo 1234567890 > dosya ("dosya" ya dize yaz.)
731 | exec 3<> dosya ("dosya" yı açın, ona fd 3'ü atayın.)
732 | read -n 4 <&3 ( Sadece 4 karakter oku.)
733 | echo -n . >&3 (Oraya bir ondalık işareti yazın.)
734 | exec 3>&- (fd 3'ü kapatın.)
735 | cat dosya ( ==> 1234.67890)
736 | 737 | ### Genel Giriş / Çıkış Yönlendirme 738 | Standart çıkış veya giriş yönlendirmesi açıkça aşağıdaki genel şekilde belirtilir.
739 | - komut 1>dosya 740 | - komut 1>>dosya 741 | - komut 0 744 | - komut 1>dosyaA 2>dosyaB
745 | Belirtilen komutun STDOUT dosyası A dosyasına yönlendirilir ve STDERR (hata mesajları) fileB dosyasına yönlendirilir. 746 | 747 | ### Ayrı Dosyaları Yeniden Yönlendirme 748 | 749 | - komut >> dosyaA 2> dosyaB 750 | - komut > fileA 2 >> fileB 751 | - komut >> dosyaA 2 >> dosyaB 752 | 753 | İlk form STDOUT dosyasını fileA'ya ekler ve STDERR'yi fileB'ye yönlendirir.
754 | İkinci form STDOUT'u fileA'ya yönlendirir ve STDERR'yi fileB'ye ekler.
755 | Üçüncü form STDOUT dosyasını fileA'ya ekler ve STDERR'yi fileB'ye ekler.
756 | 757 | ### Tek Bir Dosyaya Yönlendirme. 758 | 759 | Aynı dosyaya STDOUT ve STDERR yönlendirmek veya eklemek için temel sözdizimi;
760 | komut >file2>&1 veya command &> file
761 | komut >>file2>&1
762 | STDOUT (dosya tanımlayıcısı 1) ve STDERR (dosya tanımlayıcısı 2) belirtilen dosyaya yönlendirilir veya eklenir.
763 | komut 2>&1>>file (bunu yukarıdakiyle karşılaştır).
764 | 765 | m> & n: dosya tanımlayıcıları m, n'ye yönlendirilir.
766 |   >&n: standart çıkışı n dosya tanımlayıcısına yönlendirilir 767 | Örnek;
768 | rm -rf /tmp/my_tmp_dir > /dev/null 2>&1 769 | rdate ntp.nasa.gov >> /var/log/rdate.log 2>&1 770 | if [ ! -f $FILE ]; then echo "$FILE is not a file" >&2; fi 771 | 772 | ### Pipes ( veri yolu) 773 | 774 | Pipe (|): Bir komutun stdout'unu diğerinin stdinine bağlar.
775 | Örnekler;
776 | 777 | ls –la | less
778 | ls –al | wc
779 | ls-al | sort +4r
780 | cat file | wc
781 | man bash | grep "history"
782 | ps aux | grep user1 | wc –l
783 | 784 | 785 | ### Süreçler(Processes) 786 | 787 | Bir seferde birden fazla program çalıştırmak için;.
788 | Noktalı virgülle (;) ayrı komutlar yazılabilir
789 | - date; who (sıralı bir şekilde koşar) 790 | 791 | Aynı anda birden fazla program çalıştırmak için;
792 | Komutun sonunda ve işaretini (&) kullanın.
793 | ls -al & wc * (paralel bir şekilde koşar hangisinin nezaman biteceği kesin değildir.)
794 | 795 | ### Filtreler ( Filters) 796 | 797 | Filtre,girişi alan ve bir şekilde dönüştüren bir programdır. 798 | 799 | - wc komutu
800 | wc , satır / sözcük / karakter sayısı verir
801 | 802 | - grep komutu
803 | grep , belirli bir örneğe sahip hatları arar
804 | grep (örnek RE olabilir)
805 | 806 | - sort komutu
807 | sort , satırları alfabetik veya sayısal olarak sıralar
808 | sort -r: normal sıralama düzenini tersine çevirir
809 | sort -n: sayısal sırada sıralar
810 | sort + 2n: ikinci sütundaki öğeleri sıralar
811 | 812 | - cut komutu
813 | cut - stdout'a gönderilecek her satırın parçalarını seçer.
814 | cut -c1-5: her satırın ilk 5 karakterini seç
815 | cut -c1,5: her satırın ilk ve beşinci karakterlerini seç
816 | cut -d: -f1,3 /etc/passwd: kullanıcı adlarını ID'leriyle eşleştir
817 | 818 | - head komutu
819 | head , dosyaların ilk birkaç satırını gösterir.
820 | head -n , n: bir tam sayı
821 | 822 | - tail komutu
823 | tail , dosyanın son bölümünü görüntüler
824 | tail -n : son n satırı .
825 | tail + n : n. satırdan sonraki satırlar
826 | 827 | - diff komutu
828 | diff ,farklı olan tüm satırları gösterir.
829 | 830 | - cmp komutu
831 | cmp , iki dosyanın farklı olduğu ilk yeri bul
832 |
833 | 834 | - od komutu
835 | od , Bir dosyanın içeriğini sekizlik(oktal) gösterimini gösterir.
836 | Örneğin. od –c: tüm baytların görsel gösterimi
837 | 838 | - ls -lt komutu
839 | ls –lt , zaman sırasına göre dosya listesi
840 | 841 | - crypt komutu
842 | crypt , bir dosyayı kodlama veya kod çözme
843 | Örneğin. şifreli anahtar encrypted.file
844 | 845 | - tr komutu
846 | tr , girişindeki karakterleri çevirir.
847 | tr "[: lower:]" "[: upper:]" < (dosyadaki küçük harfleri büyük harflere çevirir.)
848 | 849 | - uniq komutu
850 | uniq , bir dosyadaki tekrarlanan satırları rapor eder veya filtreler.
851 | uniq –d , 'da tekrarlanan satırları görüntüleme
852 | uniq –u , da tekrarlanmayan ekran satırları görüntüleme
853 | uniq –c , 'daki tekrarlanan satırları tekrar sayılarıyla birlikte görüntüleme
854 | 855 | 856 | - pr komutu
857 | pr , dosyaları çeşitli şekillerde yazdırır. 858 | ls -a | pr -n -h $ (pwd) , geçerli dizindeki tüm dosyaların numaralandırılmış bir listesini yazdırır. 859 | 860 | 861 | Aşağıdaki komut ne yapar? 862 | cat * | tr -sc A-Za-z '\012' | sort | uniq –c | sort –n | tail | pr -5 –t 863 | 864 | ### Communication(iletişim) komutları 865 | 866 | - talk komutu
867 | talk ,sisteme kayitli olan baska bir kullanici ile etkileşimli sohbet
868 | Örneğin. talk hakan pts/2
869 | - write komutu
870 | write, başka bir kullanıcıya mesaj gönderme
871 | Örneğin. write hakan pts/2
872 | mesg [n | y] : mesajlara izin ver / reddet
873 | 874 | - mail, pine : text tabanlı e-posta programı
875 | - ftp, sftp : metin tabanlı FTP programı
876 | - telnet, ssh : doğrudan diğer makinelere bağlanmak için kullanılır
877 | - lynx : metin tabanlı web tarayıcısı
878 | 879 | ### Processes(süreçler) komutları 880 | - ps komutu
881 | ps , mevcut süreçleri listeler
882 | 883 | - top komutu
884 | top , sistemin süreçler tarafından kullanımının dinamik gösterimini yapar 885 | 886 | - kill komutu
887 | kill , belirlenen bir süreci sonlandır (varsayılan: SIGTERM)
888 | kill –9 (SIGKILL sinyali gönderiliyor)
889 | 890 | - time komutu
891 | time, bir süreç için zamanlama bilgisini tutar ve gösterir.
892 | time ls (real / user / sys zamanı gösteriliyor).
893 | 894 | - wait komutu
895 | wait , & ile başlayan tüm işlemleri bekliyor.(belli bir işlemi bekleme)
896 | 897 | - nohup komutu
898 | nohup , oturumu kapattıktan sonra komutu çalıştırmaya devam ettirir. 899 | 900 | - nice komutu
901 | nice , komutu düşük öncelikle çalıştırmaya devam et.
902 | nohup / nice & 903 | 904 | ### Daha fazla dosya sistemi komutları 905 | 906 | - file komutu
907 | file , dosya türünü belirler(gösterir)
908 | file /bin/ed
909 | /bin/ed: saf çalıştırılabilir
910 | 911 | Çalıştırılabilir binary bir program, başında "sihirli sayı" ile işaretlenmiştir.
912 | od / bin / ed
913 | 0000000 **077505** 046106 000402 000400 000000
914 | 915 | - du komutu
916 | du , ne kadar disk alanı kullandığını gösterir.
917 | du (disk blokları cinsinden)
918 | 919 | - df komutu 920 | df , bağlı dosya alt sistemlerindeki alanı gösterir.
921 | df –k (disk blokları cinsinden) (bir blok = 512 veya 1024 bayt)
922 | 923 | 924 | 925 | ## Bölüm-5 Regular Expressions(Düzenli ifadeler) 926 | 927 | ### RE kullanan UNIX Programları 928 | 929 | - grep (dosya içinde ara). 930 | - egrep (genişletilmiş RE'ler ile grep). 931 | - vi / emacs (metin editörleri). 932 | - ex (çizgi(line) editörü). 933 | - sed (akış(stream) editörü). 934 | - awk (örüntü(pattern) tarama dili). 935 | - perl (betik dili). 936 | 937 | 938 | ### Temel ve Genişletilmiş RE'ler 939 | 940 | Temel düzenli ifadelerde;
941 | meta karakterleri ?, +, {,}, (,), |, ve ) özel bir anlamı yoktur (grep)
942 | Onlara özel bir anlam vermek için kaçış versiyonlarını kullanın: \?, \+, \{, \}, \(, \) ve \|
943 | 944 | Genişletilmiş düzenli ifadeler kullanıldığında, bu meta karakterlerin özel bir anlamı vardır
945 | grep –E = egrep
946 | 947 | ### egrep kullanımı 948 | 949 | egrep pattern filename(s) 950 | 951 | Güvenli olmasu için, pattern(model) çevresine tırnak işaretleri yerleştirin. 952 | Örnekler:
953 | egrep "abc" textfile
954 | (dosyada “abc” içeren satırları yazdırır)
955 | egrep -i "abc" textfile
956 | (yukardakiyle aynı, ancak büyük/küçük harf farkını yoksayar ikisinide gösterir.)
957 | egrep -v "abc" textfile
958 | (dosyada “abc” içermeyen satırları yazdırır)
959 | egrep -n "abc" textfile
960 | (satır numaralarını ile beraber yazdırır)
961 | egrep -c "abc" textfile
962 | (dosyada “abc” içeren satır sayısı yazdırır)
963 | 964 | ### Metacharacters (Özel karakterler) 965 | 966 | - Nokta(period)(.): Herhangi bir karakterle eşleştirir.
967 | “a.c” abc, adc, a&c, a;c, ... ile eşleşir
968 | “u..x” unix, uvax, u3(x, ...ile eşleşir
969 | 970 | - Yıldız işareti(*): önceki RE'nin sıfır veya daha fazla oluşumuyla eşleşir.
971 | Kabuktaki joker karakterlerle(wilcards) aynı değildir!
972 | “ab*c” 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 )
973 | “. *” Herhangi bir string'le eşleşir.
974 | 975 | - Artı(+): önceki RE'nin bir veya daha fazla tekrarını eşleştirir
976 | “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 )
977 | 978 | - Soru işareti (?): Önceki RE'nin sıfır veya bir tekrarı ile eşleşir
979 | “ab?c” ac, abc ile eşleşir ancak abbc ile eşleşmez
980 | 981 | - Mantıksal veya (|): bar öncesi RE veya bar sonrası RE ile eşleşir
982 | “abc | def”, abc veya def ile eşleşir
983 | 984 | - Şapka (^): satırın başlangıcı anlamına gelir
985 | “^D.*”, D ile başlayan bir satırla eşleşir
986 | 987 | - Dolar işareti ($) satır sonu anlamına gelir
988 | “.*d$”, d ile biten bir satırla eşleşir 989 | 990 | - Ters eğik çizgi (\\): diğer meta karakterlerden kaçar yani meta karakterler ile normal karakterlerin karışmasını önler
991 | “file\\.txt”, file.txt ile eşleşiyor ancak file_txt ile eşleşmiyor
992 | 993 | - Köşeli parantez ([]): bir karakter kümesi listesini belirtir.
994 | kümedeki herhangi bir karakter eşleşecek
995 | ^ 'den sonraki karakterler ile eşleşmeyecek .
996 | -bir karakter aralığını belirtir.
997 | Örnekler:
998 | 999 | “[fF]un” fun,Fun ile eşleşir. Yani F yada f olmalı.
1000 | “b[aeiou]g” bag, beg, big, bog, bug ile eşleşiyor.
1001 | “[A-Z].*”, Büyük harfle başlayan bir dizeyle eşleşir
1002 | “[^Abc].*” a, b veya c ile başlamayan dizelerle eşleşir
1003 | 1004 | - Parantezler (()): gruplamak için kullanılır.
1005 | 1006 | “a(bc)*” ifadesi a, abc, abcbc, abcbcbc, ... ile eşleşir.
1007 | “(foot|base)ball” football ya da baseball ile eşleşir
1008 | 1009 | - Süslü Parantez ({}): bir RE'nin tekrar sayısını belirtmede kullanılır.
1010 | 1011 | “[a-z]{3}” üç küçük harfle eşleşiyor.Yani en az üç küçük harf barındırıyorsa
1012 | “m.{2,4}” dizeleri m ve ardından 2 ile 4 karakter arasında eşleştirir.
1013 | 1014 | 1015 | ### Bunlar ne anlama geliyor? 1016 | 1017 | Örnekler
1018 | egrep ”^B.*s$” dosya
1019 | egrep ”[0-9]{3}” dosya
1020 | egrep ”num(ber)? [0-9]+” dosya
1021 | egrep ”word” dosya | wc -l
1022 | egrep ”[A-Z].*\?” dosya
1023 | ls -l | egrep "^....r.-r.-"
1024 | 1025 | Ya grep kullanılırsa? 1026 | En az iki 0 içeren kullanıcı kimliğine sahip kullanıcıları arayın
1027 |   grep "^[^:]*:[^:]*:[^:]*0[^:]*0[^:]*:.*" /etc/passwd
1028 | 1029 | /etc/passwd dosya formatı;
1030 | \:\x:\:\:\:\:\
1031 | x karakteri, şifreli parolanın /etc/shadow dosyasında saklandığını gösterir.
1032 | 1033 | 1034 | ### Egrep ile kelime arama 1035 | 1036 | Sistem yazım denetimi için küçük bir sözlüğe sahip olabilir:/usr/dict/words
1037 | Beş sesli harfin tümünü içeren kelimeleri alfabetik sırayla bulun.
1038 | 1039 | cat alphvowels.
1040 | ^[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*$
1041 | egrep -f alphvowels /usr/dict/words
1042 | 1043 | Harfleri alfabetik sırada olan altı veya daha fazla harften oluşan tüm kelimeleri bulun.
1044 | cat > monotonic
1045 | ^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?$
1046 | egrep -f monotonic /usr/dict/words | grep "......"
1047 | 1048 | pratik:
1049 | En az 10 karakterden oluşan bir sözcükle başlayan satırlar.
1050 | Standart 3 bölümlü formda öğrenci kimliği içeren satırlar.
1051 | Ardışık 2 büyük harfli sözcük içeren satır sayısı.
1052 | Alfabetik karakterle bitmeyen satır sayısı.
1053 | Bir cümlenin sonunda sesli harfle başlayan bir kelimeyi içeren satırlar.
1054 | 1055 | 1056 | ## Bölüm-6 UNIX Kabuk Ortamları 1057 | 1058 | ### Kabuk özellikleri 1059 | 1060 | Kullanıcı ve işletim sistemi arasındaki komut satırı arayüzüdür.
1061 | Giriş sırasında otomatik olarak başlar.
1062 | Hem komut yorumlayıcısı hem de programlama dilidir.
1063 | Kabuk betiği(Shell script), kabuk yorumlaması için mantık içeren bir metin dosyasıdır.
1064 | 1065 | ### Kabuk Etkileşimi 1066 | 1067 | - Komut satırı ayrıştırma(parsing)
1068 | - Ortam
1069 | - Metin tamamlama (tab tuşu ile)
1070 | - Takma adlar.(Aliases)
1071 | - Komut satırı düzenleme
1072 | - Komut geçmişi
1073 | - Yapılandırma.
1074 | 1075 | ### Kabuk Programlama 1076 | 1077 | - Değişkenler 1078 | - Kontrol Yapıları (Döngüler ve şartlamalar). 1079 | - Fonksiton tanımı ve çağırma. 1080 | - Kabuk betiği(scripts). 1081 | - Sonraki bölüm. 1082 | 1083 | ### Çeşitli Unix Kabukları 1084 | 1085 | - sh (Bourne kabuğu, orijinal Unix kabuğu) 1086 | - ksh (Korn kabuğu) 1087 | - csh (Berkeley'de geliştirilen C kabuğu) 1088 | - tcsh 1089 | - bash (Bourne Kabuğu.) Linux'ta varsayılan kullanıcı kabuğu 1090 | ... 1091 | Çoğunlukla etkileşim düzeyindeki farklılıklar desteklenir.
1092 | http://www.faqs.org/faqs/unix-faq/shell/shell-differences/
1093 | 1094 | ### Kabuk Özellikleri. 1095 | ![foto1](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-6/photo1.png) 1096 | 1097 | ### Bourne Again SHell (bash) 1098 | 1099 | Bash bu döküman için standart kabuktur.
1100 | Bourne kabuğunun üst kümesidir(sh).
1101 | Sh, csh, tcsh & ksh'dan ödünç alınan özellikler vardır.
1102 | GNU projesinin bir parçasıdır.
1103 | 1104 | ### Değişkenler 1105 | 1106 | Çalışan bir kabuk için üç ana değişken türü vardır;
1107 | 1108 | Yerel(local) değişkenler;
1109 | Şu anki kabuğun içinde mevcut olan değişkenlerdir. 1110 | Komut isteminde, değişkene değer atanır.
1111 | 1112 | Ortam(environment) Değişkenleri;
1113 | Herhangi bir alt kabuk işlemi(child process) için kullanılabilir
1114 | 1115 | Kabuk değişkenleri;
1116 | Kabuk tarafından değer atanması(set) gerekir.
1117 | 1118 | ### Kabuk Değişkenleri 1119 | 1120 | Kabuğun belirli işlemler için kullandığı değişkenler kümesidir.
1121 | Kabuk değişkenleri şunları içerir:
1122 | - yerel değişkenler 1123 | - Ortam Değişkenleri 1124 | 1125 |
1126 | 1127 | - env komutu
1128 | 1129 | Geçerli ortam değişkenlerinin listesi, env komutu ile görüntülenebilir.
1130 | 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.
1131 | 1132 | 1133 | ### Ortam Değişkenleri 1134 | 1135 | Bazı ilginç değişkenler: HOME, PWD,PATH, PS1, USER, HOSTNAME
1136 | $ HOME: home dizini (cd için varsayılan değişken)
1137 | Örnek: /home/0607/student
1138 | $ PWD: mevcut çalışma dizini
1139 | Örnek: /export/home/staff/usern
1140 | $ PATH: komutlar için arama yolu
1141 | Örnek: /usr/local/bin:/bin:/usr/bin
1142 | $ PS1: komut istemi (varsayılan “$”)
1143 | Örnek: \u@\h:\w\$
1144 | $ USER: kullanıcı adı
1145 | Örnek: usern
1146 | $ HOSTNAME: bilgisayar hostname
1147 | Örnek: ktuce
1148 | 1149 | Diğer ilginç değişkenler: UID, PPID, RANDOM, HISTFILE, HISTSIZE, MAIL, MAILCHECK, PS2
1150 | $ UID: mevcut kullanıcı kimliği
1151 | $ PPID: Kabuğu çalıştıran programın işlem kimliği
1152 | $ RANDOM: 0-32767 arasında rastgele bir tam sayı oluşturur
1153 | $ HISTFILE: komut geçmişini saklamak için dosya
1154 | $ HISTSIZE: saklanacak komut sayısı
1155 | $ POSTA: posta gelmişmi diye kabuk tarafından kontrol edilen dosya
1156 | $ MAILCHECK: kontroller arasındaki saniye sayısı
1157 | $ PS2: İkincil komut istemi (varsayılan ">")
1158 | 1159 | ### Değişkenlere atama 1160 | 1161 | Değişkeni varname = value ile ayarlayın
1162 | PS1 = $USER@$HOSTNAME:
1163 |    Varsayılan kabuk istemini değiştirir
1164 | PS1 = "bash_prompt>"
1165 | PATH = $PATH:$HOME/bin , $HOME/bin yolu PATH değişkenine atandı
1166 | PATH = $PATH:~:. , ~ :. PATH'a atandı
1167 | DATE=\`date\` veya DATE=$(date) , DATE değişkeni oluşturduk ve bu değişkene sistem saatini atadık.
1168 | 1169 | 1170 | ### Metin Tamamlama 1171 | 1172 | \ geçerli komutu veya dosya adını tamamlama girişiminde bulunur.
1173 | pus\ genişler(tamamlar) için pushd\
1174 | pu\ alternatifleri verir. yani pu ile başlayan alternatif komutları gösterir bazen 2 kez \ yapmak gerebiliyor.
1175 | pu pup pushd
1176 | /etc içinde, ls init girildiğinde aşağıdakileri verir
1177 | init init.d. initpipe inittab
1178 | [lecture]$ ls init
1179 | 1180 | ### Aliases (Takma adlar) 1181 | 1182 | Takma adlar, sık kullanılan komutlar için kısa yol olarak kullanılır.
1183 | Sözdizimi: alias kısayol=komut
1184 | Örnekler:
1185 | 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.
1186 | alias pu=pushd
1187 | alias po=popd
1188 | alias l= " ls –F -C "
1189 | alias ll= " ls –L –l -F "
1190 | alias d=dirs
1191 | alias hide= " chmod og-rwx "
1192 | alias unhide= " chmod og+r "
1193 | 1194 | ### Komuta Tarihi(geçmişi) 1195 | 1196 | - history komutu
1197 | 1198 | history,önceden girilmiş komutları listelemek için kullanılır.
1199 | m'den n'ye kadar önceden yazılmış komutları listelemek için (fc -l \ \) 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
1200 | Geçmiş listesinde gezinmek için imleç tuşlarını yukarı ve aşağı kullanılabilir.
1201 | 1202 | ### Komut Satırında Düzenleme 1203 | 1204 | bash bir dizi satır düzenleme komutu sağlar.
1205 | Varsayılan emacs modu komutları.(Terminalde komut yazarken uygulanabilecek kısa yollar.)
1206 | Esc-b Bir kelime geri git
1207 | Esc-f Bir kelime ileri git
1208 | Ctrl-a Satırın başına gitme
1209 | Ctrl-e Satırın sonuna gitme
1210 | Ctrl-k İmleçten satır sonuna kadar olan metini siler.
1211 | Diğer taraftan, ksh kullanıyorsanız komut satırını etkileşimli olarak birkaç şekilde düzenleyebilirsiniz.
1212 | set -o vi, komut satırını düzenlemek için vi komutlarını kullanmanızı sağlar.
1213 | set -o vi-tabcomplete ayrıca bir TAB girerek komutları/dosya adlarını tamamlamanıza izin verir.
1214 | 1215 | 1216 | ### Login(giriş) Script'leri 1217 | 1218 | Her oturum açtığınızda takma adlar, ortam değişkenleri, komut satırı düzenlemeleri vb. Girmek istemezsiniz.
1219 | Bütün bunlar, kabuk her başlatıldığında çalıştırılan bir betikte(script) yapılabilir.
1220 | 1221 | Başlangıçta çalıştırılan başlangıç komut dosyaları;
1222 |   /etc/profile
1223 |   ~/.bash_profile
1224 |       ~/.bash_login (eğer .bash_progile yoksa)
1225 |        ~/.profile (eğer ikiside yoksa)
1226 | 1227 | Giriş yaptıktan sonra komut dosyası çalıştırıldı
1228 |      ~/.bashrc
1229 | Oturum kapatıldıktan sonra komut dosyası çalıştırıldı
1230 |    ~/.bash_logout
1231 | 1232 | 1233 | örnek .bash_ profile (partial);
1234 | 1235 | \# .bash_ profile: oturum açma kabukları için bash tarafından yürütülür.
1236 | umask 022 (0666 & ~022 = 0644 = rw-r--r--)
1237 | \# varsa, .bashrc komutunu ekleyin
1238 | if [ -f ~/.bashrc ]; then
1239 |      . \~/.bashrc
1240 | fi
1241 | \# değişkenleri ayarla
1242 | export CVSROOT=\~/.cvsroot
1243 | export EDITOR=/bin/vi
1244 | export PAGER=/usr/bin/less
1245 | 1246 | 1247 | örnek .bashrc (partial)
1248 | 1249 | \# .bashrc 1250 | \# bazı genel komutların kısaltmaları 1251 | alias bye=logout 1252 | alias h=history 1253 | alias l='ls –F -C' 1254 | alias ll='ls-L –l -F' 1255 | alias po=popd 1256 | alias pu=pushd 1257 | 1258 | Csh için, giriş kabukları çalıştırılır:
1259 | ~/.profile
1260 | ENV ayarlanmışsa:
1261 |   Bu dosya her yeni terminal için yürütülür
1262 |   örnek:
1263 |   ENV=$HOME/.cshrc
1264 |   EXPORT ENV (for bash)
1265 | 1266 | 1267 | ## Bölüm-7 Temel Kabuk Betiği (basic shell script) 1268 | 1269 | Bir kabuk betiği nedir? 1270 | 1271 | ....... 1272 | 1273 | ### Komut dosyası yürütme (Script Execution) 1274 | 1275 | komut dosyasını bir argüman gibi kabuk komutuna verin;
1276 | bash my_script
1277 | 1278 | veya komut dosyasının ilk satırında kabuğu(shell) belirleyin;
1279 | \#!/bin/bash
1280 |    komut dosyasının çalıştırılabilir olduğundan emin olun.
1281 |    my_script 'i doğrudan komut satırında çalıştırın. 1282 | 1283 | Derlemek yoktur, kabuk tarafından yorumlanır.
1284 | 1285 | Basit bir script;
1286 | \#!/bin/bash
1287 | echo "Hello, World!"
1288 | path=$(pwd)
1289 | echo $path
1290 | 1291 | Result:
1292 | Hello, World!
1293 | /home/user2
1294 | 1295 | 1296 | ## Kabuk Değişkenleri 1297 | - Numeric (Sayısal)
1298 | - String(Dize)
1299 | - Arrays (Diziler)
1300 | - Komut satırı argümanları; yalnızca okur 1301 | - Fonksiyonlar 1302 | - var değişkenin adını belirtir, $ var değere
1303 | var = 100    \# değeri 100 olarak ayarlar
1304 | echo ”\\$ var = $ var”    \# $ var = 100 yazdıracak 1305 | - unset var ile, bir değişkeni kaldırabiliriz. 1306 | - İsimler bir harfle başlar ve harf, rakam ve alt çizgi içerebilir. 1307 | 1308 | 1309 | ##Sayısal Değişkenler 1310 | 1311 | Tamsayı değişkenleri bash'te kullanılabilecek tek saf sayısal değişkenlerdir.
1312 | beyan(declaration) ve set değeri:
1313 | - declare -i var = 100
1314 | 1315 | Sayısal ifadeler çift parantez içine alınır (C stilinde).
Genel format: 1316 | 1317 | var = $((ifade)) veya var = $[ifade]
1318 | Örneğin. i = $((var ++)) veya ((var + = 1))
1319 | Örneğin. i = $((var2 = 1 + $ var)) veya ((var2 = 1 + var))
1320 | Örneğin. i = $[var + 2] - [var + = 2] Hata!
1321 | Örneğin. echo $((var * 7)) veya echo $[var * 7]
1322 | Örneğin. echo ((var2 = 1 + var)) veya echo [var2 = 1 + var]
1323 | 1324 | 1325 | Operatörler C / C ++ ile aynıdır.
1326 | ! +, -, *, /,%, &, |, <,>, <=,> =, ==, =, &&, ||, 1327 | \+ =, -! =, * =, / =,% = ~, ~ =, <<, >>, ^ 1328 | 1329 | 1330 | ### Dize(string) Değişkenleri 1331 | Açıkça başka bir tür olarak bildirilmediği sürece, değişkenler string'dir.
1332 | var = 100, var'ı "100" string'i yapar.
1333 | Bununla birlikte, değişkeni çift parantez içine koymak bir tamsayı olarak kabul edilir. ((var2 = 1 + $ var)) 1334 | 1335 | 1336 | Alt stringlerin kullanılması;
1337 | - ${string:n} \# n: index
1338 |    ${string:5} \# ilk 5 karakter haric
1339 |    ${string:(-2)} \# son iki karakter
1340 | - ${string:n:m} \# n: index, m: number
1341 |     ${string:0:5} \# ilk 5 karakter
1342 |     ${string:1:3} \# 2.ile 4. arasındaki 3 karakter
1343 | - ${#string} \# length of string
1344 | 1345 | Birleştirilen strings;
1346 | - var1="$var1 $var2"
1347 | 1348 | Manipüle string
1349 | - y=${x:${#x}-1}${x:1:${#x}-2}${x:0:1}
1350 | bu örnekte x string'inin ilk ve son karakterleri değiştirilerek y'ye atanır. 1351 | 1352 | 1353 | Değişkenin Yerine koyma;
1354 | - $name veya ${name} # name değerini kullanır
1355 | - ${name:-value} # eğer name ayarlanmadıysa, değeri(value) kullan 1356 | - ${name:=value} # name ayarlanmadıysa, değeri kullanın ve name'e degeri ata 1357 | - ${name:?value} # name ayarlanmadıysa, değeri stderr'e yazın 1358 | - ${name:+value} # eğer name ayarlanmışsa, değeri kullanın; aksi takdirde null kullanın 1359 | - ${name%pattern} # en küçük sonek kalıbını kaldır 1360 | - ${name%%pattern} # en büyük sonek kalıbını kaldır 1361 | - ${name#pattern} # en küçük önek kalıbını kaldır 1362 | - ${name##pattern} # en büyük önek kalıbını kaldır 1363 | 1364 | Dosya adı değiştirme karakterleri (*,?, [...],!) modelde kullanılabilir. 1365 | 1366 | 1367 | ### Dizi Değişkenleri 1368 | 1369 | - Dizi bir değerler listesidir. Boyut bildirmek zorunda değilsiniz 1370 | - Bir değere $ {name [index]} ile referans verilebilir. 1371 | - ${a[3]}     #dördüncü konumdaki değer 1372 | - $a     #${a[0]} ile aynıdır 1373 | 1374 | Bir dizi bildirmek için declare –a komutu kullanılabilir. 1375 | - declare -a sports 1376 | - sports=(basketball football soccer) 1377 | - spor [3] = hokey 1378 | 1379 | - dizi oluşturma
1380 | sports=(football basketball)
1381 | moresports=($sports tennis)
1382 | - ${array[@]} or ${array[*]} dizinin tüm içeriğini belirtir.
1383 | echo ${moresports[*]}
1384 | Çıkış: football tennis
1385 | - ${#array[*]} dizideki değerlerin sayısını döndürür. 1386 | echo ${#moresports[*]} 1387 | Output: 2 1388 | 1389 | ### Dışa aktarılan değişkenler 1390 | 1391 | Export komutu , kabuğun alt(child) süreçlerin değişkene erişmesine izin verir.
1392 | - export \ 1393 | - declara -x \ 1394 | 1395 | export –p değişkenlerin ve kabuğunuz tarafından verilen değerlerin bir listesini gösterir. 1396 | 1397 | vartest bir program
1398 | $> cat vartest
1399 | echo x = $x
1400 | echo y = $y
1401 | $> x=100
1402 | $> y=10
1403 | $> vartest
1404 | x =
1405 | y =
1406 | $> export y
1407 | $> vartest
1408 | x =
1409 | y = 10
1410 | 1411 | 1412 | Parantez içinde bir veya daha fazla komut alt kabukta yürütülür
1413 | - $> (cd kutusu; ls;)
1414 | Cwd'yi değiştirmeyen bin dizinindeki dosyaları listele
1415 | - $> (prog1; prog2; prog3) 2> error.txt &
1416 | Arka planda üç program yürütür.
x=50; (x=100); echo $x 50 çıktılar 1419 | 1420 | Kıvrımlı ayraçlar içindeki bir veya daha fazla komut geçerli kabuk tarafından yürütülür 1421 | - $> {cd bin; ls; } 1422 | Cwd'yi değiştiren bin dizinindeli dosyaları listeler 1423 | - $> x=50; {x =100; }; echo $x çıktı 100 1424 | Giriş ve çıkış bu yapılardan piped yapılabilir. ve G / Ç yönlendirilebilir. 1425 | 1426 | ### Komut Satırı Argümanları 1427 | 1428 | Eğer argümanlar bir betiğe(script) geçirilirse, $1,$2,$3, vb. Değerlere sahiptirler.
1429 | - $0, betiğin(script) adıdır.
1430 | - $*, $0 hariç, boşluklarla ayrılmış tüm argümanların bir dizesidir. 1431 | - $@, $0 hariç argümanların bir dizisidir. 1432 | - $#, argümanların sayısıdır. 1433 | 1434 | ### Çıktı ve alıntılama(quoting) 1435 | 1436 | - echo message ,     stdout'a yazdırır. 1437 | - echo –n "yes/no? " ,     bir bilgi istemi 1438 | Çıktıdan sonra yeni satır(newline) yazdırmıyor. 1439 | 1440 | Shell, $ ve ‘ ‘(çift tırnak) işaretleri içindeki ifadeleri yorumlar 1441 | - $ —değşken yerine geçer 1442 | - ‘ —komut yerine geçer 1443 | echo "\`date +%D`"      # 04/30/05 1444 | 1445 | Shell özel karakterleri tek tırnak işaretleri içinde yorumlamaz. 1446 | - echo '\`date +%D\`'      # \`date +%D` 1447 | 1448 | - \\  ,   karakterlerden kaçmak için kullanılır (örneğin, \ ”, \ $) 1449 | 1450 | ### Dönüş değerleri(Return values) 1451 | Komut dosyaları bir tamsayı değeri döndürebilir
1452 | return N kullanılır.
1453 | $? Değişkeni Son çalıştırılan komutun dönüş değerini içerir.
1454 | Koşulları test etmek için kullanılabilir
1455 | $> pwd
1456 | /home/user
1457 | $> echo $?
1458 | 0
1459 | $> pwdd
1460 | pwdd: not found
1461 | $> echo $?
1462 | 127
1463 | 1464 | ### Kullanıcı tanımlı değişkenler 1465 | 1466 | Örnekler:
1467 | - $> name =Ali , name değişkenine Ali değeri atanır
1468 | - $> echo $ name , Ali görüntülenecek
1469 | - $> echo Hello $name! , Welcome to $HOME 1470 | ,bunun bilgisayarınızda çıktısını görün. 1471 | 1472 | Değişken isimleri:
1473 | __FRUIT, TRUST_NO_1, _2_TIMES (geçerli)
1474 | 2_TIMES, _2*2, NO-1  Invalid (geçersiz)
1475 | 1476 | 1477 | FRUIT=peach
1478 | FRUIT=2apples
1479 | FRUIT=apple+pear+kiwi
1480 | 1481 | Boşluk kullanımına dikkat edin.
1482 | $> FRUIT=apple orange plum
1483 | bash: orange: command not found.
1484 | Tırnak kullanın.
1485 | $> FRUIT="apple orange plum"
1486 | 1487 | 1488 | ### Kullanıcı Girişi Okuma 1489 | 1490 | Genel biçim: 1491 | - read 1492 | 1493 | Okuma yürütüldüğünde, kabuk;
1494 | standart girdiden bir satır okur.
1495 | ilk sözcüğü 'de listelenen ilk değişkene atar .
1496 | ikinci sözcüğü ikinci değişkene atar. buna benzer şekilde okuma ve atama yapar.
1497 | 1498 | Satırda listelenen değişkenlerden daha fazla kelime varsa, fazla sözcük son değişkene atanır. 1499 | 1500 | - read x y
1501 | 1502 | girilen ilk satırı okur, ilk sözcüğü x değişkeninde saklar ve satırın kalanını y değişkeninde saklar. 1503 | Örnek 1504 | 1505 | - $> cat read.sh
1506 | echo   –n "Lütfen adınızı ve soyadınızı girin:"
1507 | read name1 name2
1508 |          echo "KTU bilg. müh bölümüne hoşgeldiniz, $name1 $name2" 1509 | 1510 | 1511 | 1512 | ### Komut ve Aritmetik yerdeğiştirme 1513 | 1514 | Komuttan stdout ile değiştirme;
1515 | var=\`komut` (' ' arasında geri alıntı yapar)
1516 | var=$(komut)
1517 | 1518 | İfade değeri ile değiştirme;
1519 | 1520 | var = $((expresssion))
1521 | 1522 | Örnekler:
1523 | $> echo ‘date‘ # date komutunun çıktısını görüntüler
1524 | $> echo sistemde çalışan \`who | wc –l` kişi var 1525 |    1526 | \# bunun çıktısını görün
1527 | c = $ ((2 + 3 * 4)) # "echo $ c" 14 görüntüleniyor 1528 | 1529 | 1530 | ### Tamsayılı(integer) Aritmetik 1531 | 1532 | Bash, aritmetik ifadeleri, aritmetik yerdeğiştirme olmadan değerlendirmeyi destekler.
1533 | Sözdizimi dolar işareti olmadan $((...))'a benzer.
1534 | $> x=10
1535 | $> ((x=x*12))
1536 | $> echo $x # 120 verir.
1537 | Aritmetik ifadeler, if, while ve until komutlarında kullanılabilir.
1538 | 1539 | Karşılaştırma operatörleri çıkış durumunu ayarlar(set'ler)
1540 | Karşılaştırma sonucu yanlış ise sıfır olmayan bir değer
1541 | sonuç doğruysa sıfır değeri
1542 | ((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.
1543 | if((i == 100)) ... [“$i” –eq 100] ile aynı etkiye sahip
1544 | 1545 | ### expr(ifade) komutu 1546 | 1547 | expr komutu, kullanıcı tanımlı değişkenler üzerinde hesaplamalar yapmak için başka formlar sağlar
1548 | 1549 | expr val1 op val2 (boşluklarla ayrılmış)
1550 | expr $val1 op $val2
1551 | val3 = \`expr $val1 op $val2` 1552 | 1553 | Örnekler;
1554 | $>expr 5 + 7    #12 döndürür
1555 | $>expr 6 – 3 – 2 # gives 1
1556 | $>expr 3 + 4 \\* 5 # gives 23
1557 | $>expr 24 / 3 # gives 8
1558 | $>sum= \`expr 5 + 6\`
1559 | $>echo $sum # gives 11
1560 | $>a=12
1561 | $>b=90
1562 | $>echo sum is $a + $b    # sum is 12 + 90
1563 | $>echo sum is \`expr $a + $b\`   # sum is 102
1564 | 1565 | ### Önceden Tanımlanmış Değişkenler 1566 | 1567 | Kabuk tarafından dahili olarak ayarlanan ve kullanıcıya sunulan bazı değişkenler vardır:
1568 | 1$ - $9: Konumsal parametreler
1569 | $0: Komut adı
1570 | $#: Konumsal argümanların sayısı
1571 | $? : Yürütülen son komutun çıkış durumu ondalık dizgesi (0,1,2 ..) olarak verir.
1572 | $$: Eşsiz(unique) dosya isimleri oluşturmak için yararlı olabilen, çalışılan kabuğun süreç(process) numarası.
1573 | $! : Arka planda çalışan son komutun işlem kimliği (Son arka plan işleminin PID'sini tutar).
1574 | $- : Kabuğun bu çağrısına uygulanan tedarik edilmiş mevcut seçenekler.
1575 | $* : $1 'dan başlayan, kabuğun tüm argümanlarını içeren bir dize.
1576 | $@: Alıntılananlar hariç, yukarıdakiyle aynı.
1577 | 1578 | Not: $* ve$ @ alıntı yapıldığında aynıdır ve değişkenlere genişler.
1579 | "$*", 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.
1580 | "$@", 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. 1581 | 1582 | 1583 | ### Argümanları komut dosyalarına geçirme 1584 | 1585 | Standart UNIX komutları gibi, kabuk komut dosyaları(shell scripts)'da komut satırından değişken alabilir.
1586 | 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.
1587 | $0 konum parametresi, komut adını veya kabuk komut dosyasını içeren yürütülebilir dosyanın adını belirtir.
1588 | Tüm konumsal parametreler $* özel parametresi kullanılarak ifade edilebilir.
1589 | 1590 | 1591 | Examples 1592 | 1593 | $ cat pass_arg.    1594 | \# 5 sayı kabul eden ve toplamını gösteren bir script.
1595 | aktarılan parametrelerin gösterimleri(echo ile) : $1, $2, $3, $4, $5
1596 | betiğin adının gösterimi (echo ile) : $0
1597 | aktarılan parametrelerin sayısı(echo ile) : $#
1598 | sum=\`expr $1 + $2 + $3 + $4 + $5\`
1599 | toplamları : $sum
1600 | 1601 | 1602 | ### shift komutu 1603 | 1604 | Bir komut dosyasına 9'dan fazla parametre iletilirse, parametrelere erişmek için iki alternatif vardır:
1605 | 1606 | Notasyonu ${n}
1607 | shift komutu
1608 | 1609 | 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. 1610 | 1611 | Örnek;
1612 | 1613 | Farklı sayıları kabul edecek ve toplamlarını bulacak bir komut dosyası yazalım. Parametrelerin sayısı değişebilir.
1614 | 1615 | $ cat sum_arg
1616 | sum=0
1617 | while [ $# -gt 0 ]
1618 | do
1619 |      sum=\`expr $sum + $1\`
1620 |      shift
1621 | done
1622 | echo sum is $sum
1623 | 1624 | Ö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.
1625 | 1626 | \#!/bin/bash
1627 | echo "arg1=$1 arg2=$2 arg3=$3"
1628 | shift
1629 | echo "arg1=$1 arg2=$2 arg3=$3"
1630 | shift
1631 | echo "arg1=$1 arg2=$2 arg3=$3"
1632 | shift
1633 | echo "arg1=$1 arg2=$2 arg3=$3"
1634 | 1635 | 1636 | ### Null komutu 1637 | 1638 | Kabuk yerleşik bir null komutuna sahiptir 1639 | 1640 | formatı basit; 1641 | - : 1642 | 1643 | Amaç hiçbir şey yapmamak 1644 | 1645 | Genellikle bir komutun, özellikle de komutlarda görünmesi gerekliliğini yerine getirmek için kullanılır.
1646 | 1647 | if grep “^$system” ~/mail/systems > /dev/null
1648 | then
1649 |     :
1650 | else
1651 |     echo “$system is not a valid system”
1652 |     exit 1
1653 | fi
1654 | Kabuk, bundan sonra bir komut yazmanızı gerektirir. 1655 | Sistem geçerliyse, hiçbir şey yapılmaz 1656 | 1657 | 1658 | 1659 | ### && ve || operatörleri 1660 | 1661 | 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. 1662 | 1663 | && operatörü eğer önceki komut başarılı bir şekilde derlenirse sonraki komutu uygular. 1664 | - komut1 && komut2 1665 | 1666 | komut2 yalnızca komut1 sıfır çıkış durumunu döndürürse çalıştırılır.
1667 | örnek;
1668 | [ -z $EDITOR ] && EDITOR=/bin/ed 1669 | 1670 | || operatörü eğer önceki komut başarısız bir şekilde derlenirse sonraki komutu uygular. 1671 | - komut1 || komut2 1672 | 1673 | komut2 yalnızca komut1 sıfır olmayan bir çıkış durumu döndürdüğünde çalıştırılır 1674 | 1675 | Örnekler;
1676 | [ -z $PATH ] || echo $PATH
1677 | grep "$name" phonebook || echo \
1678 | “Not found $name“
1679 | who | grep "^$name " > /dev/null || echo \
1680 | "$name's not logged on“
1681 | 1682 | (Satırın sonunda \ kullanıldığında, kabuğun satıra devam ettiğini bildirir.) 1683 | 1684 | && ve || Aynı komut satırında da birleştirilebilir: 1685 | 1686 | who | grep "^$name " > /dev/null && \\
1687 | echo "$name is logged on" || echo "$name’s \\
1688 | not logged on" 1689 | 1690 | Grep başarılı olursa ilk echo gerçekleşir;başarısız olursa ikinci echo. 1691 | 1692 | Bu operatörler if komutları ile temsil edilebilir. 1693 | 1694 | if grep "$name" phonebook
1695 | then
1696 |     :
1697 | else
1698 |     echo "Couldn't find $name“
1699 | fi
1700 | 1701 | 1702 | ### Koşullu İfadeler 1703 | 1704 | 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. 1705 | 1706 | 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. 1707 | 1708 | Tamsayı kullanıyorsanız: ((koşul))
1709 | Dizeler kullanılıyorsa: [[koşul]]
1710 | Çıkış durumları duruma bağlı olarak sıfır veya sıfır değildir
1711 | Örnekler:
1712 | (( a == 10 ))
1713 | (( b >= 3 ))
1714 | [[ $1 = -n ]]
1715 | [[ ($v != fun) && ( $v != games) ]]
1716 | (( Z > 23 )) && echo Yes
1717 | 1718 | Dosya varlığı, dosya izinleri, sahiplik, dosya türü vb. İçin özel koşullar. 1719 | 1720 | - [[ -e $file ]] –File exists? (dosya mevcut mu?) 1721 | - [[ -f $file ]] –Regular file? (dosya normal mi?) 1722 | - [[ -d $file ]] –Directory? (dizin mi?) 1723 | - [[ -L $file ]] –Symbolic link? (sembolik link?) 1724 | - [[ -r $file ]] –File has read permission? (dosya okuma izni varmı) 1725 | - [[ -w $file ]] –File has write permission? (dosya okuma yazma varmı) 1726 | - [[ -x $file ]] –File has execute permission? (dosya çalıştırma izni varmı) 1727 | - [[ -p $file]] –File is a pipe? 1728 | 1729 | 1730 | ### İf deyimi 1731 | 1732 | İf ifadesi verilen komutun çıkış durumunu kullanır ve şartlı olarak aşağıdaki ifadeleri çalıştırır. 1733 | 1734 | Genel sözdizimi:
1735 | if koşul
1736 | then
1737 |     komutlar (koşul doğruysa)
1738 | else
1739 |     komutlar (koşul yanlışsa)
1740 | fi
1741 | 1742 | İç içe if ifadesi:
1743 | if (-----)
1744 | then ...
1745 | else if ...
1746 |     ...
1747 |   fi
1748 | fi
1749 | 1750 | elif ifadesi, else if ifadesi için kısa yol olarak kullanılabilir. 1751 | 1752 | örnek:
1753 | if [[ -r $fname ]]
1754 | then
1755 |     echo “$fname is readable”
1756 | elif [[ -w $fname && -x $fname ]]
1757 | then
1758 |     echo “$fname is writeable and 1759 | executable”
1760 | fi 1761 | 1762 | ### test komutu 1763 | 1764 | 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. 1765 | 1766 | 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. 1767 | 1768 | Herhangi bir komutun çıkış durumunu nasıl öğrenebilirim? 1769 | 1770 | 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;
1771 | echo$?
1772 | 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. 1773 | 1774 | Test komutunun aşağıda açıklanan dosyalar, sayısal değerler ve diziler üzerinde çalışması için belirli operatörleri vardır: 1775 | Test komutuyla kullanılan Sayısal 1776 | 1777 | Değişkenlerdeki İşleçler: 1778 | - -eq : equal to(eşittir) 1779 | - -ne : not equals to(eşit değildir) 1780 | - -gt : grater than (dan büyüktür) 1781 | - -lt : less than (dan küçüktür) 1782 | - -ge : greater than or equal to(büyük veya eşittir) 1783 | - -le : less than or equal to(küçük veya eşittir.) 1784 | 1785 | 1786 | Test komutuyla kullanılan String Değişkenleri işleçleri: 1787 | - = : equality of strings(dizgelerin eşitliği) 1788 | - != : not equal (eşit değil) 1789 | - -z : zero length string (sıfır karakter içeren dize yani null dize). 1790 | - -n : String length is non zero.(dize uzunluğu sıfır değil) 1791 | 1792 | Örnekler:
1793 | $> a=12; b=23
1794 | $> test $a –eq $b
1795 | $> echo $?      # 1verir
1796 | $> name=”Ahmet”
1797 | $> test –z $name      #return 1
1798 | $> test –n $name      #return 0
1799 | $> test –z “$address”
1800 | $> test $name = “Ali”
1801 | 1802 | Test komutuyla kullanılan dosyalardaki operatörler:
1803 | - -f: dosya var. 1804 | - -s: dosya var ve dosya boyutu sıfır değil. 1805 | - -d: dizin var. 1806 | - -r: dosya var ve okuma iznine sahip. 1807 | - -w: dosya mevcut ve yazma iznine sahip. 1808 | - -x: dosya var ve yürütme iznine sahip. 1809 | 1810 | Örnekler:
1811 | $> test –f “mydoc.doc”
1812 | \# mydoc.doc dosyasını kontrol eder, varsa 0, yoksa 1 döndürür.
1813 | $> test –r “mydoc.doc”
1814 | \# mydoc.doc için okuma izni olup olmadığını denetler
1815 | $> test –d “$HOME”
1816 | \# kullanıcıların ana dizininin varlığını kontrol eder..
1817 | 1818 | 1819 | ### Test komutuyla kullanılan Mantıksal Operatörler: 1820 | Birden fazla koşulu birleştirmek mantıksal AND, OR ve NOT işleçleriyle yapılır. 1821 | - -a: mantıksal AND(VE) 1822 | - -o: mantıksal OR(VEYA) 1823 | - ! : mantıksal NOT(DEĞİL) 1824 | 1825 | $> test –r “mydoc.doc” –a –w “mydoc.doc”
1826 | \# 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. 1827 | 1828 | if who | grep -s hakan > /dev/null
1829 | then
1830 |     echo hakan CE sunucusuna giris yapti
1831 | else
1832 |     echo hakan CE sunucusunda mevcut degis
1833 | fi 1834 | 1835 | Bu script, şu anda sisteme giriş yapmış olan kişileri listeler ve çıktıyı grep üzerinden pipe ile yönlendirir. 1836 | 1837 | 1838 | ### durum(case) açıklamaları 1839 | 1840 | Sözdizimi:
1841 | case expression in
1842 |   pattern1)
1843 |     commands ;;
1844 |   pattern2)
1845 |     commands ;;
1846 | ... 1847 | *)
1848 |     commands ;;
1849 | esac
1850 | 1851 | örnekler:
1852 | örnek1: 1853 | case $1 in
1854 | -a)
1855 |     a seçeneğiyle ilgili komutlar ;;
1856 | -b)
1857 |     b seçeneğiyle ilgili komutlar ;;
1858 | *)
1859 |     diğer tüm seçenekler ;;
1860 | esac
1861 | 1862 | örnek2: 1863 | clear
1864 | echo "1. Date and time"
1865 | echo 1866 | echo "2. Directory listing" 1867 | echo 1868 | echo "3. Users information " 1869 | echo 1870 | echo "4. Current Directory" 1871 | echo 1872 | echo –n "Enter choice (1,2,3 or 4):" 1873 | 1874 | örnek3: 1875 | 1876 | read choice 1877 | case $choice in 1878 |     1\) date;; 1879 |     2) s -l;; 1880 |     3) who ;; 1881 |     4) pwd ;; 1882 |     *) echo wrong choice;; 1883 | esac 1884 | 1885 | 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. 1886 | 1887 | ### for döngüsü 1888 | 1889 | Sözdizimi: 1890 | for var [in list ] 1891 | do 1892 |      commands 1893 | done 1894 | 1895 | Tek bir satırdaki komutlar noktalı virgülle (;) ayrılır. 1896 | Liste belirtilmezse, $@ kabul edilir. 1897 | Aksi takdirde ${list [*]} , Burada liste bir dizi değişkenidir. 1898 | 1899 | örnekler: 1900 | 1901 | for colors in Red Blue Green Yellow Orange Black Gray 1902 |   do 1903 |     echo $colors 1904 |   done 1905 | echo 1906 | 1907 | Bu örnek verilen tüm renkleri terminale yazdırır. 1908 | 1909 | ### While döngüsü 1910 | 1911 | Sözdizimi: 1912 | while command-list1 1913 | do 1914 |    command-list2 1915 | done 1916 | 1917 | command-list1'deki son komutun çıkış durumu 0 (sıfır) ise, command-list2'deki komutlar yürütülür. 1918 | 1919 | Anahtar kelimeler break, contiune ve return , C / C ++ ile aynı özelliklere sahiptir. 1920 | 1921 | break [num] veya contiune [num] # num döngü sayısıdır 1922 | 1923 | 1924 | ### Until döngüsü 1925 | 1926 | Sözdizimi: 1927 | Until command-list1 1928 | do 1929 |    command-list2 1930 | done 1931 | 1932 | Döngü, command-list1'in çıkış durumu sıfır olmadıkça gerçekleştirilir. 1933 | 1934 | 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. 1935 | 1936 | örnekler: 1937 | 1938 | ### eval komutu 1939 | ... 1940 | (Bölüm 7 henüz bitmedi devam edicek :)) 1941 | 1942 | 1943 | 1944 | ## Bölüm-8 Gelişmiş Kabuk Betiği(Advanced Shell Scripting ) 1945 | 1946 | ### Fonksiyon oluşturma ve kullanma 1947 | 1948 | Bir kabuk fonksiyonunun tanımı aşağıdaki gibidir: 1949 | isim(){list ;} 1950 | 1951 | Geçerli ve geçersiz fonksiyon tanımları: 1952 | lsl(){ ls -l ; }     # geçerli 1953 | lsl { ls -l ; }     # geçersiz 1954 | 1955 | sh için takma ad tanımlama: 1956 | $> cat mycd 1957 | cd () { chdir ${1:-$HOME} ; PS1="\`pwd\`$ " ; export PS1 ; } 1958 | $> source mycd 1959 | 1960 | 1961 | Örnekler: 1962 | 1963 | yazdir(){ 1964 |     for i in {1..13} 1965 |      do 1966 |          echo "hakan" 1967 |          echo "$i" 1968 |      done 1969 | } 1970 | 1971 | 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. 1972 | 1973 | - source dosya_adı 1974 | 1975 | Bu komuttan sonra dosyamızdaki fonksiyonu ismiyle çağırabiliriz(sadece mevcut terminalde): 1976 | yazdir 1977 | hakan 1978 | 1 1979 | hakan 1980 | 2 ... 1981 | 1982 | 1983 | Her dizinin tek bir satırda listelenmesiyle, PATH'nin geçerli değerini listelemek: 1984 | 1985 | lspath() { 1986 |     OLDIFS="$IFS" 1987 |     IFS=: 1988 |     for DIR in $PATH ; do echo $DIR ; done 1989 |     IFS="$OLDIFS" 1990 | } 1991 | $> lspath | grep "/usr/dt/bin" 1992 | 1993 | 1994 |
1995 | Dizinini uygun hale getirmek: 1996 | 1997 | setPath() { 1998 |     PATH=${PATH:="/sbin:/bin"}; 1999 |     for _DIR in "$@" 2000 | do 2001 |         if [ -d "$_DIR" ] ; then 2002 |             PATH="$PATH":"$_DIR" ; fi 2003 |     done 2004 |     export PATH 2005 |     unset _DIR 2006 | } 2007 | 2008 | Örnek bir çağrı: 2009 | $> setPath /sbin /usr/sbin /bin /usr/bin /usr/ccs/bin 2010 | Her argümanının bir dizin olup olmadığını kontrol eder ve bir dizin varsa PATH'ye eklenir. 2011 | 2012 | 2013 | ### Fonsiyona parametre verme 2014 | 2015 | Bir parametre script'e iletildiği gibi bir fonsiyona da iletilebilir. 2016 | fonksyion tanımlamak için sözdizimi: 2017 | fonksyion fonksyion_adı() 2018 | { 2019 | deyim1 2020 | deyim2 2021 | deyimN 2022 | } 2023 | Bu işlev komut satırından veya kabuk betiğinin içinde aşağıdaki şekilde çağrılır: 2024 | fonsiyon-adı arg1 arg2 arg3 argN 2025 | 2026 | örnek: 2027 | 2028 | $ vi pass 2029 | function demo() 2030 | { 2031 | echo "All Arguments to function demo(): $*" 2032 | echo "First argument $1" 2033 | echo "Second argument $2" 2034 | echo "Third argument $3" 2035 | return 2036 | } 2037 | \# fonksyionu cağrıyoruz. 2038 | demo -f foo bar 2039 | 2040 | çıktısı: 2041 | All Arguments to function demo(): -f foo bar 2042 | First argument -f 2043 | Second argument foo 2044 | Third argument bar 2045 | 2046 | ### Değer döndürme(return) 2047 | 2048 | Örnek tanım: 2049 | function topla { 2050 | (( toplam=$1+$2 )) 2051 | return $toplam 2052 | } 2053 | 2054 | fonksiyonu çağırmak: 2055 | topla 2 3 2056 | echo $? 2057 | 2058 | $? son işlev çağrısından veya komut tarafından döndürülen değerdir. 2059 | 2060 | 2061 | ### Fonksiyonlar arasında veri paylaşımı 2062 | 2063 | C kabuğu(shell),csh, UNIX dosya sisteminde hızlı hareket etmek için üç yardımcı komut sağlar: 2064 | - popd 2065 | - pushd 2066 | - dirs 2067 | 2068 | 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. 2069 | 2070 | 2071 | dirs uygulaması: 2072 |
2073 | dirs() { 2074 |   \# IFS'yi kaydedin, ardından şuna ayarlayın: 2075 |   \# _DIR_STACK öğelerine ayrı ayrı erişmek için. 2076 |    OLDIFS="$IFS" 2077 |   IFS=: 2078 |   # her dizini ve ardından bir boşluk yazdır 2079 |   for i in $_DIR_STACK 2080 |   do 2081 |     echo "$i \c“ 2082 |   done 2083 |   # tüm girişlerden sonra yeni bir satır ekle 2084 |    \# _DIR_STACK yazdırıldı 2085 |   echo 2086 |    \# IFS'yi geri yükle 2087 |   IFS="$OLDIFS" 2088 | } 2089 | 2090 | pushd uygulaması: 2091 | ...(gelecek) 2092 | popd uygulaması: 2093 | ...(gelecek) 2094 | 2095 | ### echo komutu 2096 | 2097 | metin veya değişken değerlerini gösterir. 2098 | echo [options] [string, değişkenler ...] 2099 | 2100 | Seçenekler: 2101 | - -n Sondaki yeni satırı çıkışa vermez. 2102 | - -e Aşağıdaki kaçış karakterleri yorumlar. 2103 | - \\c Sondaki yeni satırı bastırır. 2104 | - \\a Bir uyarı (zil). 2105 | - \\b geri al. 2106 | - \\n yeni satır. 2107 | - \\r satır başı. 2108 | - \\t yatay sekme(tab). 2109 | - \\ters eğik çizgi. 2110 | 2111 | ### renkli metin gösterme 2112 | 2113 | echo ile birlikte kullanılan bazı kontrol karakterleri vardır. 2114 | Bu kod, mesajı Mavi renkte yazdırır: 2115 | $> echo "\033[34m Hello Colorful World!" 2116 | Hello Colorful World! 2117 | 2118 | Bu ANSI kaçış dizisini kullanır (\033[34m). 2119 | \033, kaçış karakteri, biraz harekete geçiyor 2120 | [34m kaçış kodu ön plan rengini Mavi olarak ayarlar 2121 |     [ CSI'nin başlangıcıdır (Komut Dizisi Giriş). 2122 |     34, parametredir. 2123 |     m harfdir (eylemi belirtir). 2124 | 2125 | Genel sözdizimi: 2126 | echo -e "\033[ escape-code your-message " 2127 |
2128 | (Bu başlık vakit bulursam genişletilebilir...) 2129 | 2130 | ### Komut dosyası yürütme(script execution) 2131 | 2132 | Komut dosyasını kabuk programına bir argüman olarak verin (ör. Bash my_script). 2133 | Veya komut dosyasında hangi kabuğun kullanılacağını belirtin. 2134 | - script'in ilk satırı #!/bin/ bash 2135 | - Komut dosyasını chmod kullanarak yürütülebilir duruma getirin. 2136 | - PATH'in geçerli dizini içerdiğinden emin olun. 2137 | - Doğrudan komut satırından çalıştırın 2138 | 2139 | Derleme gerekmez! 2140 | 2141 | 2142 | 2143 | ## Bölüm-9 Yazılım Geliştirme: g++ ve make 2144 | 2145 | ### Yazılım geliştirme süreçi 2146 | 2147 | - Kaynak dosyalarının oluşturulması.(.c, .h, .cpp) 2148 | - Derleme (*.c , *.o) ve bağlama(linking) 2149 | - Programları çalıştırma ve test etme. 2150 | 2151 | 2152 | Geliştirme araçları: 2153 | Kaynak dosyalarının oluşturulması.(.c, .h, .cpp) 2154 |      Text editörleri; vi ,emacs 2155 |      versiyon kontrol sistemleri; rcs, cvs 2156 | Derleme (*.o) and bağlama. 2157 |     Derleyiciler; gcc, g++ 2158 |     Otomatik yapı(building) araçları; make 2159 | Çalıştırma ve test etme(xdb,gdb) 2160 | 2161 | ### Derleme şüreci 2162 | 2163 | ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-9/photo1.png) 2164 | 2165 | ### Temel g++ Örnekleri 2166 | 2167 | - g++ hello.cpp 2168 |      hello.cpp derlenir 2169 |      çalıştırılabilir a.out dosyası üretir 2170 | - g++ -o hello hello.cpp 2171 |      hello.cpp derlenir 2172 |      çalıştırılabilir hello dosyası üretir. 2173 | - g++ -o hello hello.cpp util.cpp 2174 |      hello.cpp ve util.cpp derlenir 2175 |      çalıştırılabilir hello dosyası üretir. 2176 | 2177 | Ayrı ayrı derleme: Herhangi bir kaynak dosyadan, daha sonra çalıştırılabilir yapmak için bağlanacak bir nesne dosyası oluşturabilirsiniz. 2178 | - g++ -c hello.cpp 2179 | - g++ -c util.cpp 2180 | - g++ -o hello hello.o util.o 2181 | 2182 | 2183 | ### g++ seçenekleri 2184 | 2185 | - -c 2186 |     kaynak dosyalarını derler ama bağlantı(link) yapmak 2187 |     çıktı(output) kaynak dosyaya karşılık gelen bir nesne dosyasıdır. 2188 | - o \ 2189 |     çıktıyı \ adlı bir dosyaya koyar. 2190 | - g 2191 |     çıktıdaki hata ayıklama(debugging) sembollerini dahil et. 2192 |     daha sonra hata ayıklama programı(gdb) tarafından kullanılacak. 2193 | - Wall 2194 |     Tüm uyarıları göster(program hala derlenebilir). 2195 | - -D\ 2196 |     macro '1' string'i ile tanımlanır 2197 | - -l\ 2198 |     lib\.a adlı kütüphaneyi dahil eder. 2199 | - -I\ 2200 |     verilen dizinde bulunan dosyalar dahil etmek(include) için bakar. 2201 | - L\ 2202 |     verilen dizinden bulanan kütüphanelere bakar. 2203 | 2204 | g++'nın kütüphaneler ve dahil edilen dosyalar için varsayılan dizinleri vardır. 2205 | 2206 | 2207 | ### g++ 'da tanımlar 2208 | 2209 | Genellikle programlar aşağıdakilere dayanan koşullu parçalar içerir: 2210 | \#ifdef DEBUG 2211 | printf(“value of var is %d”, var); 2212 | \#endif 2213 | 2214 | Önişlemci tanımlarını komut satırından ayarlayabilirsiniz: 2215 | g++ -DDEBUG -o prog prog.c 2216 | 2217 | 2218 | (genişletilecek...) 2219 | 2220 | ### Derlemede'de make kullanımı 2221 | 2222 | Çok sayıda dosya içeren orta ve büyük çaplı yazılım projelerini derlemek şu sebeblerden zor olur: 2223 | - Her seferinde tüm dosyaları doğru bir şekilde derlemek için komutların yazılması 2224 | - Hangi dosyaların değiştirildiğinin takip edilmesi 2225 | - Dosyalar arasındaki bağlılıkların takip edilmesi 2226 | 2227 | make, bu işlemleri otomatikleştirir. 2228 | 2229 | ### make'in temek işlemleri 2230 | 2231 | Programı oluşturmak için, kurallar içeren [Mm]akefile adlı bir dosyayı okur. 2232 | - Eğer program başka bir dosyaya bağlıysa, ozaman bu dosya oluşturulur. 2233 | - Tüm bağımlılıklar bağımlılıklar zincirinde geri doğru çalışacak şekilde inşa(build)edilir. 2234 | - Programlar yalnızca bağlı(depend) oldukları dosyalardan daha eski ise inşa(built) edilebilir. 2235 | 2236 | ### Temel Makefile Örnekleri 2237 | 2238 | \# mydb için Makefile 2239 | mydb: mydb.o user.o database.o 2240 |     g++ -o mydb mydb.o user.o database.o 2241 | mydb.o : mydb.cpp mydb.h 2242 |     g++ -c mydb.cpp 2243 | user.o : user.cpp mydb.h 2244 |     g++ -c user.cpp 2245 | database.o : database.cpp mydb.h 2246 |     g++ -c database.cpp 2247 | 2248 | ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-9/photo2.png) 2249 | 2250 | 2251 | ### Bir Makefile'ın parçaları 2252 | 2253 | Bağımlılık satırları: 2254 | - Hedef(target) adlarını ve bağımlılıklarını içerir (isteğe bağlı) 2255 | - bağımlılıklar(dependencies) 2256 |     Dosyalar 2257 |     hedefler 2258 | Komutlar: 2259 | - bağımlılık satırın altında olmalı 2260 | - her zaman bir çıkıntıyla(tab) başla 2261 | - bağımlılığı karşılamak için komutlar 2262 | 2263 | ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-9/photo3.png) 2264 | 2265 | ### Makrolar(macros) ve özel değişkenler 2266 | 2267 | Makefile'daki metni temsil etmek için makrolar kullanılır. 2268 | - yazarken kaydeder. 2269 | - Makefile'ın kolayca değiştirilmesine izin verir. 2270 | - atamalar(assignment) 2271 |     Kullanımı: ${MACRONAME} 2272 | 2273 | Komutlarda özel değişkenler kullanılır: 2274 | - $@ hedefi temsil ediyor. 2275 | - $? bağımlılıkları temsil ediyor. 2276 | 2277 | ### örneği basitleştirme 2278 | 2279 | OBJS = mydb.o user.o database.o 2280 | CC = /usr/bin/g++ 2281 | 2282 | mydb: ${OBJS} 2283 |     ${CC} -o $@ $? 2284 | mydb.o: mydb.cpp mydb.h 2285 |     ${CC} -c $? 2286 | user.o: user.cpp mydb.h 2287 |     ${CC} -c $? 2288 | database.o: database.cpp mydb.h 2289 |     ${CC} -c $? 2290 | 2291 | 2292 | ### Make'i cağırmak (invoking make) 2293 | 2294 | - açıklama dosyası olduğundan emin olun 2295 |     makefile veya Makefile olarak adlandırılır 2296 |     kaynak dosyalarının bulunduğu dizinde 2297 | - make 2298 |     dosyada ilk hedefi oluşturur 2299 | - make hedef(leri) 2300 |      hedef(leri) oluşturur(builds). 2301 | - diğer seçenekler: 2302 |      \-n: komutları çalıştırma, sadece listele 2303 |      \-f \: [Mm]akefile yerine \ 'ı kullan. 2304 | 2305 | 2306 | ### Diğer Makefile Notları ve Son ek(suffix) kuralları 2307 | 2308 | Yorumlar ‘#’ ile başlar 2309 | Bir satırın başına veya yorum olmayan bir satırın sonuna konulabilir. 2310 | Çok uzun olan satırlar, önceki satırın sonuna line \\ koyarak bir sonraki satırda devam edebilir. 2311 | 2312 |
2313 | Son Ek Kuralları: 2314 | her .o dosyasını kaynak dosyadan nasıl oluşturacağını söylemek hala sıkıcı. 2315 | Sonek kuralları bu tür durumları genelleştirmek için kullanılabilir. 2316 | 2317 | - Varsayılan bir sonek kuralı, komut tarafından çalıştırarak kaynak dosyalarını, .o dosyalarına dönüştürür: 2318 |     ${CC} ${CFLAGS} -c $< 2319 | - $< , önkoşul anlamına gelir (file.cpp) 2320 | 2321 | ### En Basit Makefile Örneği 2322 | 2323 | OBJS = mydb.cpp user.cpp database.cpp 2324 | CC = /usr/bin/g++ 2325 | 2326 | mydb: ${OBJS} 2327 |     ${CC} -o $@ $? 2328 | 2329 | ### Diğer Faydalı Makefile İpuçları 2330 | 2331 | Ara dosyaları(intermediate) kaldırmanın bir yolunu dahil edin. 2332 | - clean: 2333 |     rm –f mydb 2334 |     rm -f * .o 2335 | 2336 | çoklu programlar oluşturmak için bir hedef dahil edin. 2337 | - all: mydb mycalendar myhomework 2338 | 2339 | 2340 | ## Bölüm-10 Hata ayıklama (Debugging) 2341 | 2342 | (pek yakında...) 2343 | 2344 | ## Bölüm-11 Dosya yönetimi (File Management) 2345 | 2346 | (devamı pek yakında...) 2347 | 2348 | ### Sistem Çağrıları 2349 | 2350 | Programlar, kütüphaneler üzerinden sistem çağrıları yapar.  2351 | - libc, sistem çağrıları için C arayüzü sağlar. 2352 | - doğrudan Unix çekirdeğine bir altprogram çağrısı. 2353 | 2354 | 4 ana sistem çağrısı kategorisi: 2355 | - Dosya yönetimi. 2356 | - Süreç yönetimi. 2357 | - İletişim. 2358 | - Hata ve sinyal işleme. 2359 | 2360 | 2361 | ### Program yürütmek 2362 | 2363 | - Özel bir başlatma rutini (crt0) her zaman programınıza bağlanır. 2364 | - Bu rutin argümanları okur ve main'i çağırır. 2365 | - Libc kütüphanesi programınıza otomatik olarak bağlanır; bu şekilde birçok C işlevine (printf, open, vb.) erişiminiz vardır. 2366 | - Programınız, çıkışta dosya tanımlayıcılarını kapatan ve diğer kaynakları temizleyen özel işlevler de çağırır. 2367 | 2368 | ### C'ye karşı C++ 2369 | 2370 | - string veri türü yok 2371 | Bunun yerine karakter dizileri kullanın 2372 | Karakter dizilerini “atamak” için strcpy (), strncpy (), strcmp (), strncmp () kullanın. 2373 | - Gömülü beyan yok(embedded declarations) 2374 | Tüm değişkenlerin bir kod bloğunun başlangıcında bildirilmesi gerekir 2375 | - Çok farklı Dosya ve Standart G / Ç fonksiyonları 2376 | printf() cout'a karşı 2377 | scanf() ve fgets() cin'e karşı 2378 | 2379 | 2380 | ### Arabelleksiz(unbeffered) G/Ç vs. Standart G/Ç 2381 | 2382 | Arabelleksiz giriş/çıkış: 2383 | - sistem çağrılarını kullanarak g/ç gerçekleştirebilir.(open,read,write,close,lseek) 2384 | - arabellek boyutunu ve bayt'ların numarasını belirtmeniz gerekir. 2385 | - Biçimlendirme seçeneği yok. 2386 | - Bu fonksiyonlar dosya tanımlayıcılarını argüman olarak kullanır. 2387 | - Sabitler unistd.h'da tanımlanır(STDIN_FILENO, gibi). 2388 | 2389 | Standart giriş/çıkış: 2390 | - Bir C kütüphanesi fonksiyon dizisi(printf,scanf,getc) 2391 | - Arabellekleme(bufferin) otomatik. 2392 | - Birçok biçimlendirme seçeneği 2393 | - stdio fonksiyonları ilkel sistem çağrılarından oluşur. 2394 | - Sabitler stdio.h'da tanımlanır(stdin, gibi). 2395 | 2396 | ### Temel Dosya G/Ç 2397 | 2398 | - Unix'de herşeyin bir dosya olduğunu hatırlayın ve unutmayın. 2399 | - çekirdek(kernel), her süreç için açık dosyaların bir listesini tutar. 2400 | - Dosyalar okuma,yazma için açılabilir. 2401 | - G/Ç sistem çağrılarını kullanmak için \ dahil edilmelidir.(include) 2402 |      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. 2403 | 2404 | 2405 | - Çoğu Unix G/Ç, 5 sistem çağrısı ile yapılabilir. 2406 |      open, read, write, close, lseek 2407 | - Her dosya bir dosya tanımlayıcısı tarafından referans edilir(bir tam sayı)). 2408 | - Üç dosya otomatik olarak açılır: 2409 |      FD 0: standart giriş 2410 |      FD 1: standart çıkış 2411 |      FD 2: standart hata 2412 | - Yeni bir dosya açıldığı zaman, en küçük FD'ye atanır. 2413 | - man -s 2 (daha fazla bilgi almak için) 2414 | 2415 | ### open() 2416 | 2417 | int open(char *path, int flags, mode_t mode); 2418 | path: absolute(mutlak) veya relative(göreceli) path 2419 | flags(bayraklar): 2420 | - O_RDONLY - okumak için aç 2421 | - O_WRONLY - yazmak için aç 2422 | - O_RDWR - okuma ve yazma için aç 2423 | - O_CREAT - mevcut değilse dosyayı oluştur 2424 | - O_TRUNC - eğer varsa dosyayı keser (üzerine yazar). 2425 | - O_APPEND - sadece dosyanın sonuna yaz 2426 | 2427 | modu: eğer O_CREAT kullanıyorsanız, izinleri açıkca belirtin 2428 | Yeni atanan dosya tanımlayıcısını döndürür. 2429 | 2430 | - Oluşturulma izinleri: 2431 |     777 vs 0777 vs 0x777 2432 |      izinler: 2433 | - read(r--,4) 2434 | - write(-w-,2) 2435 | - execute(--x,1) 2436 | 2437 | kim(who): 2438 | 2439 | - user(0700) 2440 | - group(0070) 2441 | - others(0007) 2442 | 2443 | 2444 | - fd = open(”name”, O_RDWR|O_CREAT, 0700); 2445 | - fd dönen değer: 2446 |     fd >= 0 – açma başarılır 2447 |     fd < 0 – açma başarısız 2448 | 2449 | 2450 | ### read() ve write() 2451 | 2452 | ssize_t read(int fd, void *buf, size_t nbytes); 2453 | ssize_t write(int fd, void *buf, size_t nbytes); 2454 | 2455 | - fd, open tarafından döndürülen değerdir. 2456 | - buf genellikle bir veri dizisidir 2457 | - nbayt buf boyutu(okunan) veya yazılacak veri boyutudur 2458 | - döndürülen değer: 2459 |     > 0 okunan veya yazılan bayt sayısıdır. 2460 |     <= okumak için nbayt 2461 |     0 EOF(dosya sonunun habercisi) 2462 |     < 0 error 2463 | 2464 | ### read() örneği 2465 | 2466 | bytes = read(fd, buffer, count); 2467 | Fd ile ilişkili dosyadan okur. 2468 | okunan bayt sayısını veya hata mesajı yani -1 değerini döndürür 2469 | 2470 | int fd=open("someFile", O_RDONLY); 2471 | char buffer[4]; 2472 | int bytes = read(fd, buffer, 4); 2473 | 2474 | 2475 | ### write() örneği 2476 | 2477 | bytes = write(fd, buffer, count); 2478 | Fd ile ilişkili dosyaya yazar. 2479 | yazılan bayt sayısını veya hata mesajı yani -1 değerini döndürür 2480 | 2481 | int fd=open("someFile", O_WRONLY); 2482 | char buffer[4]; 2483 | int bytes = write(fd, buffer, 4); 2484 | 2485 | 2486 | ### stdin'i stdout'a kopyalamak 2487 | 2488 | \#define BUFFSIZE 8192 2489 | // bu nasıl seçilir 2490 | int main(void) { 2491 | 2492 | int n; 2493 | char buf[BUFFSIZE]; 2494 | while ((n=read(STDIN_FILENO, buf, BUFFSIZE)) > 0) 2495 |   if (write(STDOUT_FILENO, buf, n) != n) 2496 |     printf("write error"); 2497 |   if (n < 0) 2498 |     printf("read error"); 2499 | } 2500 | 2501 | 2502 | 2503 | ### close() 2504 | 2505 | int close(int fd); 2506 | 2507 | - fd ile ilişkili dosya kapatılır. 2508 | - başarı durumda 0, hata durumunda -1 döndürür. 2509 | - close(1); 2510 |      standart çıkışı kapatır. 2511 | 2512 | 2513 | 2514 | ### lseek() 2515 | 2516 | off_t lseek(int fd, off_t offset, int whence); 2517 | 2518 | - Dosya işaretcisini(pointer) yeni konumuna taşır. 2519 | - fd, open tarafından döndürülen sayıdır. 2520 | - off_t , long veya int... değil, dörtlü olabilir. 2521 | - ofsett , bayt sayısıdır. 2522 | - nereden(whence): 2523 |     SEEK_SET – dosyanın başlangıcından itibaren ofsett(bayt sayısı kadar) 2524 |     SEEK_CUR – mevcut konumdan offsett 2525 |     SEEK_END – dosyanın sonundan ofsett 2526 | - Dosyanın başlangıcında veya hata durumunda offsett -1 döndürür. 2527 | 2528 | ### lseek() örnekler 2529 | 2530 | Standart girişin aranıp aranmayacağını test edelim. 2531 | 2532 | int main(void) { 2533 | if (lseek(STDIN_FILENO, 0, SEEK_CUR)==-1) 2534 |     printf("cannot seek\n"); 2535 | else 2536 |     printf("seek OK\n"); 2537 | exit(0); 2538 | } 2539 | 2540 | a.out < /etc/motd “seek OK ” verir. 2541 | $ cat < /etc/motd | a.out “cannot seek” verir 2542 | $ a.out < /var/spool/cron/FIFO “cannot seek” verir 2543 | 2544 |
2545 | 2546 | char buf1[] = "abcdefghij“, buf2[] = "ABCDEFGHIJ"; 2547 | int fd = creat("file.hole", FILE_MODE); 2548 | write(fd, buf1, 10); 2549 | lseek(fd, 40, SEEK_SET); 2550 | write(fd, buf2, 10); 2551 | 2552 | a.out 2553 | $ ls -l file.hole      boyutunu kontrol et 2554 | -rw-r--r-- 1 root 50 Jul 31 05:50 file.hole 2555 | 2556 | $ od -c file.hole      gerçek içeriğine bakalım 2557 | ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-11/photo1.png) 2558 | 2559 | 2560 | ## Bölüm-12 Süreç Yönetimi (Process Management) 2561 | 2562 | 2563 | ### Unix'te süreçler 2564 | 2565 | Süreç(process): Temel yürütme birimi 2566 | - Bir programın çalıştırılması 2567 | - Bir süreç kimliğine sahiptir (PID) 2568 | - Bir süreç hiyerarşisinde oluşurlar (parents and children) 2569 | - Root(kök) başlangıç sürecidir. 2570 | - Her sürecin kendi durumu/içeriği/belleği vardır. 2571 | 2572 | Süreçler ile ilgili shell komutları: 2573 | ps, top, kill, nice,... 2574 | 2575 | ### süreç belirtmek 2576 | 2577 | ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-12/photo1.png) 2578 | 2579 | ### Dosya Nesneleri ve Dosya Tanımlayıcıları 2580 | 2581 | Stdio kütüphanesi, arabellek(buffering) kullanan FILE nesneleri sağlar. 2582 | 2583 | - FILE *stdin, *stdout, *stderr; 2584 | 2585 | Neden arabelleğe alma? Verimlilik. 2586 | FILE nesneleri, dosya tanımlayıcıların üzerine inşa edilmiştir. 2587 | Süreç yönetimi görevleri için dosya tanımlayıcılarını kullanacağız. 2588 | 2589 | ### Ara belleğe alma(Buffering) 2590 | 2591 | - un-buffered(ara belleğe alınmamış):çıktı hemen görünür 2592 |      stderr arabelleğe alınmaz 2593 | - line buffered(satır ara belleğe alınmış): tam bir satır yazıldığı zaman çıktı görüntülenir. 2594 |      stdout, ekrana giderken arabelleğe alınan satırdır 2595 | - block buffered(blok ara belleğe alınmış): bir tampon doldurulduğunda veya bir tampon temizlendiğinde çıktı görünür. 2596 |     normalde bir dosyaya çıkış blok arabelleğe alınır. 2597 |     stdout bir dosyaya yönlendirildiğinde arabelleğe alınmış bloktur. 2598 | 2599 | 2600 | ### Dosya tanımlayıcıları 2601 | 2602 | Düşük seviye I / O tarafından kullanılır: 2603 | - open(), close(), read(), write() 2604 | 2605 | Bir tam sayı gibi tanımlanır. 2606 | - int fd; 2607 | 2608 | Bir FILE nesnesini fd'ye dönüştürmek için kullanışlı bir sistem çağrısı. 2609 | - int fileno( FILE *fp); 2610 | 2611 | Elbette bir dosya tanıtıcısına bir akış arayüzü atamak mümkündür. 2612 | - FILE *fdopen(int fd, const char *mode); 2613 | 2614 | ### Süreç Yönetimi Sorunları 2615 | 2616 | Sistem, aşağıdakilerle ilgilenmektedir: 2617 |   - Bir süreç oluşturmak 2618 |   - Programın ayarlanması bir süreç yürütür 2619 |   - Bir i sonlandırılması bekleniyor 2620 | - Bir süreçin sonlandırılması. 2621 |   - Bir süreçe sinyal gönderme. 2622 | - süreçler arasında iletişim kurmak 2623 | 2624 | 2625 | ### Unix'i başlatma 2626 | 2627 | ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-12/photo2.png) 2628 | 2629 | Hangi süreçlerin çalıştını görmek için: "top" , "ps -aux" komutlarını çalıştırın. 2630 | 2631 | 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. 2632 | 2633 | ### Csh komutları nasıl çalıştırır? 2634 | 2635 | ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-12/photo3.png) 2636 | 2637 | - Bir komut yazıldığında, csh fork olur(yeni süreç doğurma) ve sonra yazılan komutu yürütür. 2638 | - fork'dan(çatallanma) sonra, dosya tanımlayıcıları 0, 1 ve 2, yeni süreçde hala stdin, stdout ve stderr'ye başvurur. 2639 | - Kurallara göre, yürütülen program bu tanımlayıcıları uygun şekilde kullanacaktır. 2640 | 2641 | ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-12/photo4.png) 2642 | 2643 | ### Süreç oluşturma 2644 | 2645 | - fork sistemi çağrısı, çalışmakta olan programın bir kopyasını oluşturur. 2646 | - Kopya (child süreç) ve orijinal (parent süreç) her ikisi de fork noktasından aynı verilerle devam eder. 2647 | - Tek fark, fork çağrısından dönüş(return) değeridir. 2648 | 2649 | ### Fork : PID'ler ve PPID'ler 2650 | 2651 | - Sistem çağrısı: int fork() 2652 | -fork() başarılı olursa, çocuk(child) PID'yi ebeveynine(parent) ve 0 değerini çocuğa döndürür; 2653 | - fork() başarısız olursa, parent'a -1 döndürür (alt öğe oluşturulmaz) 2654 | - İlgili sistem çağrıları: 2655 |     int getpid() - geçerli süreçin PID değerini döndürür 2656 |     int getppid() - parent süreçinin PID değerini döndürür (1'in ppid değeri 1'dir) 2657 |     int getpgrp() - geçerli sürecin grup ID'sini döndürür 2658 | 2659 | 2660 | ### fork() başarısız olduğunda 2661 | 2662 | İki olası sebep: 2663 | 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. 2664 | 2665 | Çekirdek işlemlere sanal bellek ayırır Belleği yetersiz kaldığında, fork çağrıları başarısız olur. 2666 | 2667 | ### fork () özellikleri 2668 | 2669 | Çocuk tarafından ebeveynden miras alınan özellikler: 2670 | - UID, GID 2671 | - kontrol terminali 2672 | - CWD, kök dizini 2673 | - sinyal maskesi, çevre, kaynak sınırları 2674 | - paylaşılan bellek segmentleri 2675 | 2676 | Ebeveyn ve çocuk arasındaki farklar: 2677 | - PID, PPID, fork()'dan dönüş değeri 2678 | - Bekleyen alarmlar çocuk için silindi. 2679 | - Çocuk için bekleyen sinyaller silinir. 2680 | 2681 | fork örneği: 2682 | 2683 | int i, pid; 2684 | i = 5; 2685 | printf(“%d\n”, i); 2686 | pid = fork(); 2687 | if(pid != 0) 2688 |     i = 6; /* sadece parent buraya gelir */ 2689 | else 2690 |     i = 4; /* sadece child buraya gelir */ 2691 | printf(“%d\n”, i); 2692 | 2693 | ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-12/photo5.png) 2694 | 2695 | PID/PPID örneği: 2696 | 2697 | \#include 2698 | \#include 2699 | int main(void) { 2700 | int pid; 2701 | printf("ORIG: PID=%d PPID=%d\n",getpid(), getppid()); 2702 | pid = fork(); 2703 | if(pid != 0) 2704 |     printf("PARENT: PID=%d PPID=%d\n",getpid(), getppid()); 2705 | else 2706 |     printf("CHILD: PID=%d PPID=%d\n",getpid(), getppid()); 2707 | return(1); 2708 | } 2709 | 2710 | çıktı: 2711 | ORIG: PID=27989 PPID=27167 2712 | PARENT: PID=27989 PPID=27167 2713 | CHILD: PID=27990 PPID=27989 2714 | 2715 | 2716 | ### Program Yürütme (Executing a Program) 2717 | 2718 | - Exec sistem çağrısı, bir süreç tarafından yürütülen programın yerine farklı bir program koyar. 2719 | - Yeni program baştan yürütmeye başlar. 2720 | Başarı durumunda, exec asla geri değer döndürmez, başarısızlık durumunda exec -1 döndürür. 2721 | 2722 | ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-12/photo6.png) 2723 | 2724 | Örnek: 2725 | 2726 | Program X: 2727 | int i = 5; 2728 | printf("%d\n", i); 2729 | exec(“Y”); 2730 | printf("%d\n", i); 2731 | 2732 | Program Y: 2733 | printf("hello\n"); 2734 | 2735 | ### exec() özellikleri 2736 | 2737 | Yeni süreç çağrılan sürecinden aşağıdakileri miras alır: 2738 | - PID ve PPID, gerçek UID, GID, oturum ID. 2739 | - kontrol terminali. 2740 | - CWD, kök dizini, kaynak limitleri. 2741 | - süreç sinyali maskesi. 2742 | - Bekleyen sinyaller 2743 | - Bekleyen alarmlar 2744 | - dosya modu oluşturma maskesi (umask). 2745 | - dosya kilitleri. 2746 | 2747 | altı versiyon exec(): 2748 | - execl(char *path, char *arg0, ..., (char *)0); 2749 | - execv(char *path, char *argv[]); 2750 | - execle(char *path, char *arg0, ..., (char *)0,char *envp[]); 2751 | - execve(char *pathname, char *argv[], char *envp[]); 2752 | - execlp(char *file, char *arg0, ..., (char *)0); 2753 | - execvp(char *file, char *argv[]); 2754 |      2755 | 2756 | 2757 | 2758 | 2759 | 2760 | 2761 | 2762 | 2763 | 2764 | -------------------------------------------------------------------------------- /photos/bölüm-11/photo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-11/photo1.png -------------------------------------------------------------------------------- /photos/bölüm-12/photo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-12/photo1.png -------------------------------------------------------------------------------- /photos/bölüm-12/photo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-12/photo2.png -------------------------------------------------------------------------------- /photos/bölüm-12/photo3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-12/photo3.png -------------------------------------------------------------------------------- /photos/bölüm-12/photo4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-12/photo4.png -------------------------------------------------------------------------------- /photos/bölüm-12/photo5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-12/photo5.png -------------------------------------------------------------------------------- /photos/bölüm-12/photo6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-12/photo6.png -------------------------------------------------------------------------------- /photos/bölüm-2/photo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-2/photo1.png -------------------------------------------------------------------------------- /photos/bölüm-2/photo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-2/photo2.png -------------------------------------------------------------------------------- /photos/bölüm-2/photo3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-2/photo3.png -------------------------------------------------------------------------------- /photos/bölüm-2/photo4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-2/photo4.png -------------------------------------------------------------------------------- /photos/bölüm-6/photo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-6/photo1.png -------------------------------------------------------------------------------- /photos/bölüm-9/photo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-9/photo1.png -------------------------------------------------------------------------------- /photos/bölüm-9/photo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-9/photo2.png -------------------------------------------------------------------------------- /photos/bölüm-9/photo3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hknakst/Sistem-programlama/81007577e610787bcbeab0bb1c365ab2439e42d5/photos/bölüm-9/photo3.png --------------------------------------------------------------------------------