{"id":19689127,"url":"https://github.com/hknakst/Sistem-programlama","last_synced_at":"2025-04-29T08:35:05.775Z","repository":{"id":90072338,"uuid":"173118185","full_name":"hknakst/Sistem-programlama","owner":"hknakst","description":"Sistem Programlama Türkçe Kaynak (KTÜ)","archived":false,"fork":false,"pushed_at":"2020-05-09T21:58:03.000Z","size":1263,"stargazers_count":53,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-11-11T18:48:16.179Z","etag":null,"topics":["bash","bash-script","filemanagement","kabuk","linux","linux-shell","linuxcommand","linuxkomutlar","processmanagement","regular-expressions","script","scripts","shell","sistem","sistem-programlama","sistemprogramlama","system-programming","unix","unix-command","vim"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hknakst.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-02-28T13:35:21.000Z","updated_at":"2024-10-29T21:54:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"a37ce067-48e8-4730-864c-025183782b91","html_url":"https://github.com/hknakst/Sistem-programlama","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hknakst%2FSistem-programlama","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hknakst%2FSistem-programlama/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hknakst%2FSistem-programlama/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hknakst%2FSistem-programlama/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hknakst","download_url":"https://codeload.github.com/hknakst/Sistem-programlama/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251465259,"owners_count":21593852,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","bash-script","filemanagement","kabuk","linux","linux-shell","linuxcommand","linuxkomutlar","processmanagement","regular-expressions","script","scripts","shell","sistem","sistem-programlama","sistemprogramlama","system-programming","unix","unix-command","vim"],"created_at":"2024-11-11T18:42:53.790Z","updated_at":"2025-04-29T08:35:05.743Z","avatar_url":"https://github.com/hknakst.png","language":null,"funding_links":[],"categories":["Others"],"sub_categories":[],"readme":"# Sistem-programlama\n## İçindekiler\n- [Sistem-programlama](#sistem-programlama)\n  - [İçindekiler](#%c4%b0%c3%a7indekiler)\n  - [Bölüm-1 Giriş](#b%c3%b6l%c3%bcm-1-giri%c5%9f)\n    - [neden Unix?](#neden-unix)\n    - [Unix versionları](#unix-versionlar%c4%b1)\n    - [Unix tabanlı bir sistemin katmanları](#unix-tabanl%c4%b1-bir-sistemin-katmanlar%c4%b1)\n    - [Unix hesapları](#unix-hesaplar%c4%b1)\n    - [Shell(kabul) nedir?](#shellkabul-nedir)\n    - [Shell sistemi](#shell-sistemi)\n  - [Bölüm-2 Unix dosya sistemi](#b%c3%b6l%c3%bcm-2-unix-dosya-sistemi)\n    - [Çalışma dizini(working directory) \u003c/br\u003e](#%c3%87al%c4%b1%c5%9fma-diziniworking-directory-br)\n    - [Başlangıç(ana) Dizini(home directory) \u003c/br\u003e](#ba%c5%9flang%c4%b1%c3%a7ana-dizinihome-directory-br)\n    - [Unix Dosya Hiyerarşisi](#unix-dosya-hiyerar%c5%9fisi)\n    - [Unix yolları (Unix paths)](#unix-yollar%c4%b1-unix-paths)\n    - [Bazı standart dizinler](#baz%c4%b1-standart-dizinler)\n    - [Dizin değiştirme (changing directories) \u003c/br\u003e](#dizin-de%c4%9fi%c5%9ftirme-changing-directories-br)\n    - [Dosya bilgisi (ls -al) \u003c/br\u003e](#dosya-bilgisi-ls--al-br)\n    - [Dosya türleri](#dosya-t%c3%bcrleri)\n    - [I-nodes](#i-nodes)\n    - [Dosya işlemleri](#dosya-i%c5%9flemleri)\n    - [Dizin oluşturma ve silme](#dizin-olu%c5%9fturma-ve-silme)\n    - [Links(bağlantılar) oluşturma](#linksba%c4%9flant%c4%b1lar-olu%c5%9fturma)\n    - [Dosya sahipliği](#dosya-sahipli%c4%9fi)\n    - [Dosya izinleri](#dosya-izinleri)\n    - [Dosyanın içeriğine bakmak](#dosyan%c4%b1n-i%c3%a7eri%c4%9fine-bakmak)\n    - [Wildcards(joker karakterler)(Globbing)](#wildcardsjoker-karakterlerglobbing)\n    - [Unix komutlarında yardım almak](#unix-komutlar%c4%b1nda-yard%c4%b1m-almak)\n    - [Diğer dosya sistemleri](#di%c4%9fer-dosya-sistemleri)\n  - [Bölüm-3 Text Editing](#b%c3%b6l%c3%bcm-3-text-editing)\n    - [Neden vi?](#neden-vi)\n    - [cursor hareketi:](#cursor-hareketi)\n    - [file operation:](#file-operation)\n    - [arama:](#arama)\n  - [Bölüm-4 Shell operatörleri](#b%c3%b6l%c3%bcm-4-shell-operat%c3%b6rleri)\n    - [Üç standart dosya](#%c3%9c%c3%a7-standart-dosya)\n    - [stdout yönlendirme](#stdout-y%c3%b6nlendirme)\n    - [stdin yönlendirme](#stdin-y%c3%b6nlendirme)\n    - [Standart dosya tanımlayıcıları](#standart-dosya-tan%c4%b1mlay%c4%b1c%c4%b1lar%c4%b1)\n    - [Dosya tanımlayıcı oluşturma](#dosya-tan%c4%b1mlay%c4%b1c%c4%b1-olu%c5%9fturma)\n    - [Dosya Tanımlayıcıları ile Yönlendirme](#dosya-tan%c4%b1mlay%c4%b1c%c4%b1lar%c4%b1-ile-y%c3%b6nlendirme)\n    - [Genel Giriş / Çıkış Yönlendirme](#genel-giri%c5%9f--%c3%87%c4%b1k%c4%b1%c5%9f-y%c3%b6nlendirme)\n    - [Ayrı Dosyaları Yeniden Yönlendirme](#ayr%c4%b1-dosyalar%c4%b1-yeniden-y%c3%b6nlendirme)\n    - [Tek Bir Dosyaya Yönlendirme.](#tek-bir-dosyaya-y%c3%b6nlendirme)\n    - [Pipes ( veri yolu)](#pipes--veri-yolu)\n    - [Süreçler(Processes)](#s%c3%bcre%c3%a7lerprocesses)\n    - [Filtreler ( Filters)](#filtreler--filters)\n    - [Communication(iletişim) komutları](#communicationileti%c5%9fim-komutlar%c4%b1)\n    - [Processes(süreçler) komutları](#processess%c3%bcre%c3%a7ler-komutlar%c4%b1)\n    - [Daha fazla dosya sistemi komutları](#daha-fazla-dosya-sistemi-komutlar%c4%b1)\n  - [Bölüm-5 Regular Expressions(Düzenli ifadeler)](#b%c3%b6l%c3%bcm-5-regular-expressionsd%c3%bczenli-ifadeler)\n    - [RE kullanan UNIX Programları](#re-kullanan-unix-programlar%c4%b1)\n    - [Temel ve Genişletilmiş RE'ler](#temel-ve-geni%c5%9fletilmi%c5%9f-reler)\n    - [egrep kullanımı](#egrep-kullan%c4%b1m%c4%b1)\n    - [Metacharacters (Özel karakterler)](#metacharacters-%c3%96zel-karakterler)\n    - [Bunlar ne anlama geliyor?](#bunlar-ne-anlama-geliyor)\n    - [Egrep ile kelime arama](#egrep-ile-kelime-arama)\n  - [Bölüm-6 UNIX Kabuk Ortamları](#b%c3%b6l%c3%bcm-6-unix-kabuk-ortamlar%c4%b1)\n    - [Kabuk özellikleri](#kabuk-%c3%b6zellikleri)\n    - [Kabuk Etkileşimi](#kabuk-etkile%c5%9fimi)\n    - [Kabuk Programlama](#kabuk-programlama)\n    - [Çeşitli Unix Kabukları](#%c3%87e%c5%9fitli-unix-kabuklar%c4%b1)\n    - [Kabuk Özellikleri.](#kabuk-%c3%96zellikleri)\n    - [Bourne Again SHell (bash)](#bourne-again-shell-bash)\n    - [Değişkenler](#de%c4%9fi%c5%9fkenler)\n    - [Kabuk Değişkenleri](#kabuk-de%c4%9fi%c5%9fkenleri)\n    - [Ortam Değişkenleri](#ortam-de%c4%9fi%c5%9fkenleri)\n    - [Değişkenlere atama](#de%c4%9fi%c5%9fkenlere-atama)\n    - [Metin Tamamlama](#metin-tamamlama)\n    - [Aliases (Takma adlar)](#aliases-takma-adlar)\n    - [Komuta Tarihi(geçmişi)](#komuta-tarihige%c3%a7mi%c5%9fi)\n    - [Komut Satırında Düzenleme](#komut-sat%c4%b1r%c4%b1nda-d%c3%bczenleme)\n    - [Login(giriş) Script'leri](#logingiri%c5%9f-scriptleri)\n  - [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)\n    - [Komut dosyası yürütme (Script Execution)](#komut-dosyas%c4%b1-y%c3%bcr%c3%bctme-script-execution)\n  - [Kabuk Değişkenleri](#kabuk-de%c4%9fi%c5%9fkenleri-1)\n    - [Dize(string) Değişkenleri](#dizestring-de%c4%9fi%c5%9fkenleri)\n    - [Dizi Değişkenleri](#dizi-de%c4%9fi%c5%9fkenleri)\n    - [Dışa aktarılan değişkenler](#d%c4%b1%c5%9fa-aktar%c4%b1lan-de%c4%9fi%c5%9fkenler)\n    - [Komut Satırı Argümanları](#komut-sat%c4%b1r%c4%b1-arg%c3%bcmanlar%c4%b1)\n    - [Çıktı ve alıntılama(quoting)](#%c3%87%c4%b1kt%c4%b1-ve-al%c4%b1nt%c4%b1lamaquoting)\n    - [Dönüş değerleri(Return values)](#d%c3%b6n%c3%bc%c5%9f-de%c4%9ferlerireturn-values)\n    - [Kullanıcı tanımlı değişkenler](#kullan%c4%b1c%c4%b1-tan%c4%b1ml%c4%b1-de%c4%9fi%c5%9fkenler)\n    - [Kullanıcı Girişi Okuma](#kullan%c4%b1c%c4%b1-giri%c5%9fi-okuma)\n    - [Komut ve Aritmetik yerdeğiştirme](#komut-ve-aritmetik-yerde%c4%9fi%c5%9ftirme)\n    - [Tamsayılı(integer) Aritmetik](#tamsay%c4%b1l%c4%b1integer-aritmetik)\n    - [expr(ifade) komutu](#exprifade-komutu)\n    - [Önceden Tanımlanmış Değişkenler](#%c3%96nceden-tan%c4%b1mlanm%c4%b1%c5%9f-de%c4%9fi%c5%9fkenler)\n    - [Argümanları komut dosyalarına geçirme](#arg%c3%bcmanlar%c4%b1-komut-dosyalar%c4%b1na-ge%c3%a7irme)\n    - [shift komutu](#shift-komutu)\n    - [Null komutu](#null-komutu)\n    - [\u0026\u0026 ve || operatörleri](#ve--operat%c3%b6rleri)\n    - [Koşullu İfadeler](#ko%c5%9fullu-%c4%b0fadeler)\n    - [İf deyimi](#%c4%b0f-deyimi)\n    - [test komutu](#test-komutu)\n    - [Test komutuyla kullanılan Mantıksal Operatörler:](#test-komutuyla-kullan%c4%b1lan-mant%c4%b1ksal-operat%c3%b6rler)\n    - [durum(case) açıklamaları](#durumcase-a%c3%a7%c4%b1klamalar%c4%b1)\n    - [for döngüsü](#for-d%c3%b6ng%c3%bcs%c3%bc)\n    - [While döngüsü](#while-d%c3%b6ng%c3%bcs%c3%bc)\n    - [Until döngüsü](#until-d%c3%b6ng%c3%bcs%c3%bc)\n    - [eval komutu](#eval-komutu)\n  - [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)\n    - [Fonksiyon oluşturma ve kullanma](#fonksiyon-olu%c5%9fturma-ve-kullanma)\n    - [Fonsiyona parametre verme](#fonsiyona-parametre-verme)\n    - [Değer döndürme(return)](#de%c4%9fer-d%c3%b6nd%c3%bcrmereturn)\n    - [Fonksiyonlar arasında veri paylaşımı](#fonksiyonlar-aras%c4%b1nda-veri-payla%c5%9f%c4%b1m%c4%b1)\n    - [echo komutu](#echo-komutu)\n    - [renkli metin gösterme](#renkli-metin-g%c3%b6sterme)\n    - [Komut dosyası yürütme(script execution)](#komut-dosyas%c4%b1-y%c3%bcr%c3%bctmescript-execution)\n  - [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)\n    - [Yazılım geliştirme süreçi](#yaz%c4%b1l%c4%b1m-geli%c5%9ftirme-s%c3%bcre%c3%a7i)\n    - [Derleme şüreci](#derleme-%c5%9f%c3%bcreci)\n    - [Temel g++ Örnekleri](#temel-g-%c3%96rnekleri)\n    - [g++ seçenekleri](#g-se%c3%a7enekleri)\n    - [g++ 'da tanımlar](#g-da-tan%c4%b1mlar)\n    - [Derlemede'de make kullanımı](#derlemedede-make-kullan%c4%b1m%c4%b1)\n    - [make'in temek işlemleri](#makein-temek-i%c5%9flemleri)\n    - [Temel Makefile Örnekleri](#temel-makefile-%c3%96rnekleri)\n    - [Bir Makefile'ın parçaları](#bir-makefile%c4%b1n-par%c3%a7alar%c4%b1)\n    - [Makrolar(macros) ve özel değişkenler](#makrolarmacros-ve-%c3%b6zel-de%c4%9fi%c5%9fkenler)\n    - [örneği basitleştirme](#%c3%b6rne%c4%9fi-basitle%c5%9ftirme)\n    - [Make'i cağırmak (invoking make)](#makei-ca%c4%9f%c4%b1rmak-invoking-make)\n    - [Diğer Makefile Notları ve Son ek(suffix) kuralları](#di%c4%9fer-makefile-notlar%c4%b1-ve-son-eksuffix-kurallar%c4%b1)\n    - [En Basit Makefile Örneği](#en-basit-makefile-%c3%96rne%c4%9fi)\n    - [Diğer Faydalı Makefile İpuçları](#di%c4%9fer-faydal%c4%b1-makefile-%c4%b0pu%c3%a7lar%c4%b1)\n  - [Bölüm-10 Hata ayıklama (Debugging)](#b%c3%b6l%c3%bcm-10-hata-ay%c4%b1klama-debugging)\n  - [Bölüm-11 Dosya yönetimi (File Management)](#b%c3%b6l%c3%bcm-11-dosya-y%c3%b6netimi-file-management)\n    - [Sistem Çağrıları](#sistem-%c3%87a%c4%9fr%c4%b1lar%c4%b1)\n    - [Program yürütmek](#program-y%c3%bcr%c3%bctmek)\n    - [C'ye karşı C++](#cye-kar%c5%9f%c4%b1-c)\n    - [Arabelleksiz(unbeffered) G/Ç vs. Standart G/Ç](#arabelleksizunbeffered-g%c3%87-vs-standart-g%c3%87)\n    - [Temel Dosya G/Ç](#temel-dosya-g%c3%87)\n    - [open()](#open)\n    - [read() ve write()](#read-ve-write)\n    - [read() örneği](#read-%c3%b6rne%c4%9fi)\n    - [write() örneği](#write-%c3%b6rne%c4%9fi)\n    - [stdin'i stdout'a kopyalamak](#stdini-stdouta-kopyalamak)\n    - [close()](#close)\n    - [lseek()](#lseek)\n    - [lseek() örnekler](#lseek-%c3%b6rnekler)\n  - [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)\n    - [Unix'te süreçler](#unixte-s%c3%bcre%c3%a7ler)\n    - [süreç belirtmek](#s%c3%bcre%c3%a7-belirtmek)\n    - [Dosya Nesneleri ve Dosya Tanımlayıcıları](#dosya-nesneleri-ve-dosya-tan%c4%b1mlay%c4%b1c%c4%b1lar%c4%b1)\n    - [Ara belleğe alma(Buffering)](#ara-belle%c4%9fe-almabuffering)\n    - [Dosya tanımlayıcıları](#dosya-tan%c4%b1mlay%c4%b1c%c4%b1lar%c4%b1)\n    - [Süreç Yönetimi Sorunları](#s%c3%bcre%c3%a7-y%c3%b6netimi-sorunlar%c4%b1)\n    - [Unix'i başlatma](#unixi-ba%c5%9flatma)\n    - [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)\n    - [Süreç oluşturma](#s%c3%bcre%c3%a7-olu%c5%9fturma)\n    - [Fork : PID'ler ve PPID'ler](#fork--pidler-ve-ppidler)\n    - [fork() başarısız olduğunda](#fork-ba%c5%9far%c4%b1s%c4%b1z-oldu%c4%9funda)\n    - [fork () özellikleri](#fork--%c3%b6zellikleri)\n    - [Program Yürütme (Executing a Program)](#program-y%c3%bcr%c3%bctme-executing-a-program)\n    - [exec() özellikleri](#exec-%c3%b6zellikleri)\n## Bölüm-1 Giriş\n### neden Unix?\n modern bir işletim sistemi;\n- stable : kararlı, kullanıcı ne kadar zorlasada hata yapmaya yönelik bundan etkilenmez.\n- flexible : kullanıcı kendine çalışabilir bir alan oluşturabilir.\n- configurable : yapılandırılabilir.\n- allows multiple users and programs\n- Birçok bilimsel ve endüstriyel ortamda kullanılır\n- Çok sayıda özgür ve iyi yazılmış yazılım programı\n- Açık kaynaklı işletim sistemi (OS)\n- Mükemmel programlama ortamı\n- Büyük ölçüde donanımdan bağımsız\n- Standartlara dayalı\n- İ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)\n\n### Unix versionları\niki ana gelişim kolu vardır.\nTwo main threads of development:\n- Berkeley software distribution (BSD) (http://www.bsd.org)\n- Unix System Laboratories (http://www.unix.org) \u003c/br\u003e\nBSD: SunOS 4, Ultrix, BSDI, OS X, NetBSD, FreeBSD, OpenBSD, Linux (GNU) \u003c/br\u003e\nSYS V: System V (AT\u0026T -\u003e Novell -\u003e SCO), Solaris (SunOS 5), HP-UX (Hewlett-Packard), AIX\n\n### Unix tabanlı bir sistemin katmanları\n\n- işletim sistemi kernel modda çalışır, sistem çağrıları kernel moddadır.(sistem çağrısı: sistemin kaynağı kullanmak istemesi.)\n- Standart Library, sistem çağrısı doğrudanda kullanılabilir, kütüphane çağrısı olarakta kullanılabilir.\n- 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 .)\n- shell , kullanıcı komutlarını kabul eder ve bunları yerine getirmekle sorumludur.\n- 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.\n\n### Unix hesapları\nBir Unix makinesine giriş yapmak o sistem için bir hesap gerektirir.\nBir kullanıcı hesabı giriş ve şifre ile ilişkilendirilmiştir.\n“login” kullanıcı adınızdır, şifreniz siz yazarken gösterilmez.(login shell kullanıcıya hizmet veren ilk shell'dir)\n\nTerminal 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 \nsüreç oluşturur süreç kendisini iki parçaya böler(parent,child).\nSonra 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.\n\n### Shell(kabul) nedir?\nSadece giriş yaptığınızda bir Unix programı çalıştırılabilir.\nBir komut yorumlayıcısıdır.\n - UNIX yardımcı programlarına temel kullanıcı arabirimini sağlar.\nBir programlama dilidir.\n  -kabuk komutlarından oluşan program kabuk komut dosyası olarak adlandırılır.\nKomutları bir dosyaya koyabilir ve çalıştırabilirsiniz\n\n### Shell sistemi\nGiriş 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.\nKomut satırında yazdıklarımızı bir dosya içerisine yazarak hepsini icra edebiliriz bu dosya scriptfile dosyası olmuş olur.\nDosya 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.\nDosyanın hangi shell ile koşacağını belirtmek için;\n- #!/bin/bash\n\n\\#!: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.\n\n/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.\n\n- \\# ifadesiyle başlayan satırlar yorum satırlarıdır. \n\nBu 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=\u003ekomut dili yorumlayıcısı)\n\nshell(kabuk), Unix sistemine komut göndermek için kullandığınız programdır. Bazı komutlar tek bir kelimedir.örneğin;\n- who komutu\n\nBu komutla o anki kullancı detaylarını görebiliriz. aynı şekilde whoami komutu ile o anki kullanıcının adını görebiliriz\nw komutu ilede login olmuş kullanıcıları görebiliriz.\n\n- date komutu\n\nBu komutla terminal ekranında sistem tarih ve saat bilgilerini görebiliriz.\n\n- ls komutu \n\nbulunduğumuz directory(dizin)'deki dosyaları listeler\n\n- $\u003e komut argüman1 argüman2\n\nargümanlarla komuş işlemini değiştirebiliyoruz, daha detaylı listeleme gibi örneğin;\n- ls -l\n- ls -a\n- ls -la\n- ls -a;ls -l\n- ls -F\n- ls -al textfile1\n- ls -al textfile1 textfile2\n- ls -al directory\n\nls -l komutu ile dosların ve dizinlerin çok daha detaylı(izinler,kullanıcı ve grup\u003c/br\u003e bilgileri, oluşturulma tarihi vb.) halini liste şeklinde görebiliriz.\nls -a komutu gizli dosya ve dizinleri görebiliriz.\u003c/br\u003e\nls -la veya ls -al komutuylada ls -l ve ls -a komutlarını beraber kullanabiliriz.\u003c/br\u003e\nls -a;ls -l şeklinde de iki komut calıştırılabilir.\u003c/br\u003e\nls bin komutuda bin klasöründekileri listeler\u003c/br\u003e\nls textfile1 textfile2 yazarsakta bu dosyaları listeler.\n\nBir komut satırında komut icra ettiğinzde sistem komutu veya programı ise;\u003c/br\u003e\nshell 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.\nshell 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.\n\nKomut satırı tepki vermiyorsa bir işlemi icra ediyor ve bir problem olmuş olabilir.\n- ctrl + c \n\nkesme gönderir, süreci keser.\n\n- ctrl + z\n\nsürecin icrasını durdurur.\n\n- ps \n\nps 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.\n\n- fg ve bg \n\nbg 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.\n\nfg 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.\n\n- ctrl + d ve exit\n\nterminali kapatır(logout).\n\n\n## Bölüm-2 Unix dosya sistemi\n\nDosya sistemi, makinenizdeki fiziksel depolama(diskler) , diğer makinelerdeki depolama (NFS), giriş/çıkış cihazları ve benzeri durumlar için sizin arayüzünüzdür. \u003c/br\u003e\nUnix'de herşey bir dosyadır.(porgramlar, text dosyaları, çevre birimleri, terminaller...) \u003c/br\u003e\nDizinler diğer dosyaları içeren(referanslara) bir dosyadır. \u003c/br\u003e\nUnix'de sürücü harfleri yoktur.Dosya sistemi, depolama aygıtlarına mantıksal bir görünüm sağlar. \u003c/br\u003e\n\n### Çalışma dizini(working directory) \u003c/br\u003e\nÇalışma dizini: dosya sisteminin geçerli konumu yani sistemdeki konumunuz.\n- pwd komutu  \u003c/br\u003e\n\npwd (print working directory) komutu çalışma dizininizin mutlak yolunu (daha sonra) verir.\nBaşka bir dizin belirtmediğiniz sürece, bir komut çalışma dizini içerisinde çalışmak istediğinizi varsayar.\n\n### Başlangıç(ana) Dizini(home directory) \u003c/br\u003e\nAna dizin: kişisel kullanıcı alanı.\nOturum açıldığında, çalışma dizininiz ana dizininize ayarlanacaktır.\nAna dizininize giden yol, ~ (tilde) sembolüyle belirtilebilir.\nKullanıcı1'in ana dizini ~ kullanıcı1 şeklinde belirtilebilir.\nBaşka bir dizindeysek cd ~/ komutunu vererek ana dizine gidebiliriz.\n\n### Unix Dosya Hiyerarşisi\n\n ![foto1](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-2/photo1.png)\n \nKök dizini(Root directory) : / , bütün dosyalar root'a bağlanır.\nDizinler düz dosyalar veya başka dizinler içerebilir.\nSonuç, dosya sistemi bir ağaç yapısıdır.\nUnix, herhangi özel bir dosya adı uzantısını tanımıyor.\n\n### Unix yolları (Unix paths)\n\nDizinler / ile ayrılır.\nAbsolute path(tam yol): Root(kök)'dan başlayarak ağacın takip edildiği yoldur.Örneğin: \u003c/br\u003e\n/home/user1/textfile \u003c/br\u003e\n~user1/textfile \u003c/br\u003e\n~/textfile \u003c/br\u003e\nAbsolute path kullanıcı dizini referans alınarak bildirim yapar. \n\nRelative path(göreceli yol): çalışma dizininden başlar. \u003c/br\u003e\n- ..  bir üst dizindir(parent)\n- .  çalışma dizinidir(yani dizinin kendisini ifade eder.\n\ntextfile \u003c/br\u003e\nbil318/lec1.txt \u003c/br\u003e\nçalışma dizinini referans alma : ./../textfile \u003c/br\u003e\nparent'ı referans alma : ../textfile \u003c/br\u003e\n\n### Bazı standart dizinler\n\nBu dizinler / yani root altındadır. \u003c/br\u003e\n/ bin - standart komutlar ve yardımcı programlar; yürütülebilir.Kullanıcının koşabildiği tüm programlar bu dizindedir. \u003c/br\u003e\n/ sbin - root tarafından icra edilebilen programlar, sistem komutları ve yardımcı programları (önyükleme için gerekli) bulunur \u003c/br\u003e\n/ 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 \u003c/br\u003e\n/ etc - ana bilgisayara özgü yapılandırma; host hizmetleri \u003c/br\u003e\n/ home - kullanıcıların ana dizinleri.Kullanıcının login ismiyle dizinler açılır (home/hakan)\u003c/br\u003e\n/ lib - çeşitli diller için kütüphane dizini.(.so unix dosyaları , .dll windows dosyaları)\u003c/br\u003e\n/ tmp - geçici dosyalar.(veritabanında taplo update ,update set işlemlerinde tmp kullanılır) \u003c/br\u003e\n/ usr - kullanıcı yardımcı programları ve uygulamaları; / Usr / local /. Kurulumda değil daha sonra sisteme dahil olan programlardır olsada olur olmasada.\u003c/br\u003e\n/ 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)\n\n\n### Dizin değiştirme (changing directories) \u003c/br\u003e\n\n- cd komutu \u003c/br\u003e\n\nÇalışma dizinini değiştirmek için kullanılır. cd \\\u003cdizin yolu\u003e şeklinde kullanılır. Absolute veya relative yollar kullanılabilir. \u003c/br\u003e\nHerhangi 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. \u003c/br\u003e \ncd /home/user1 \u003c/br\u003e\ncd ../../user1\n\n### Dosya bilgisi (ls -al) \u003c/br\u003e\n\n ![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-2/photo2.png)\n\n### Dosya türleri \n\nPlain (düz) (-): çoğu dosya bu türdedir, ikili(binary) veya metin dosyaları. \u003c/br\u003e\nDirectory (dizin) (d): bir dosya kümesini gösterir \u003c/br\u003e\nSymbolic (sembolik) link (l): Başka bir dosya veya dizine işaretçi(pointer).\u003c/br\u003e\nÖzel dosyalar; \u003c/br\u003e\n     \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; Karakter cihazı (c): klavye, yazıcı, joystick.\u003c/br\u003e\n     \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; Block cihazı (b): disk, CD-ROM.\u003c/br\u003e\nİletişim dosyaları;\u003c/br\u003e\n     \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; FIFO (p): geçici bir depolama cihazı (sıra).\u003c/br\u003e\n     \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; Soket (ler): soket dosyaları \u003c/br\u003e\n\n- ls -F komutu\n\nls -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.\u003c/br\u003e\n\n(boş): Normal dosya\u003c/br\u003e\n*:\u0026nbsp;\u0026nbsp; Yürütülebilir program veya komut dosyası\u003c/br\u003e\n/:\u0026nbsp;\u0026nbsp; Dizin \u003c/br\u003e\n@ :\u0026nbsp;\u0026nbsp; Sembolik bağlantı \u003c/br\u003e\n| :\u0026nbsp;\u0026nbsp; FIFO (named pipe)\n=:\u0026nbsp;\u0026nbsp; Soket \u003c/br\u003e\n\n-ls -i komutu\n\nls -i komutu her dosya için i-node numarasını yazdırır.\n\n### I-nodes\n\nDosya sistemindeki her nesne için yönetim bilgisidir.\nİnode'lar diskte bulunur ve isimleri yoktur. Bunun yerine, inode dizisindeki pozisyonlarını belirten endekslere (sayılara) sahiptirler. \u003c/br\u003e\nHer inode genellikle şunları içerir:\n\n- Varsa, öğenin içeriğinin diskteki konumu\n- Öğenin türü (örneğin, dosya, dizin, sembolik bağlantı)\n- Varsa, öğenin bayt cinsinden boyutu\n- Dosyanın inode'unun en son değiştirildiği saat (ctime)\n- Dosyanın içeriğinin en son değiştirildiği saat (saat)\n- Dosyanın en son erişildiği zaman (atime), okuma, yürütme vb.\n- Referans sayısı: Dosyanın sahip olduğu adların sayısı\n- Dosyanın sahibi (bir UID)\n- Dosyanın grubu (bir GID)\n- Dosyanın mod bitleri (ayrıca dosya izinleri veya izin bitleri olarak da bilinir)\n\n(inode yapısı cizilebilir)\n\n### Dosya işlemleri \n\n- touch \u003cfile\u003e komutu\n \n touch komutu ile dosya oluşturulur veya oluşturulmuş dosyanın son değiştirilme tarihi değiştirilir. \u003c/br\u003e\n \n - mv \u003cfile1\u003e \u003cfile2\u003e\n \n 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. \u003c/br\u003e\n \n - mv \u003cfile1\u003e \u003cdir\u003e \n \n mv komutunun ikinci parametresine dizin verirsek , birinci parametredeki dosyayı bu dizine taşır. \u003c/br\u003e\n \n - mv \u003cfile1\u003e \u003cdir/file2\u003e\n \n 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. \u003c/br\u003e \n \n \n - cp \u003cfile\u003e [\u003cfile2\u003e|\u003cdir\u003e|\u003cdir/file2\u003e] komutu\n \n 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. \u003c/br\u003e\n \n- rm [-i] \u003cfiles(s)\u003e\n\ndosya 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.\n\n### Dizin oluşturma ve silme\n\n- mkdir \u003cdirectory_name\u003e komutu\n\nGeçerli dizinin altında yeni bir dizin oluşturur.\n\n- rmdir \u003cdirectory_name\u003e komutu\n\nsadece boş dizini silebilir.\n\n- rm -r \u003cdirectory_name\u003e komutu\n\nDizini 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.\n\n### Links(bağlantılar) oluşturma\n\n- ln –s \u003cexisting_file\u003e \u003clink_name\u003e komutu\n\nsembolik bir bağ (-s) oluşturur. \u003c/br\u003e\nlink_name, başka bir dizinde veya başka bir fiziksel makinede bulunabilecek varolan dosyanın bir göstergesidir. \u003c/br\u003e\nhard 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. \u003c/br\u003e\n\n ![foto3](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-2/photo3.png)\n\nln -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. \u003c/br\u003e\n\nln 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.\u003c/br\u003e\n\n\n\n### Dosya sahipliği\n\nHer dosyanın tek bir sahibi var. \u003c/br\u003e\nchown komutu sahibini değiştirmek için kullanılabilir; genellikle sadece root bu komutu kullanabilir. \u003c/br\u003e\nHer dosya aynı zamanda tek bir gruba aittir. \u003c/br\u003e\nGruplar herkesten farklı izinlere sahip olabilir. \u003c/br\u003e\n\n### Dosya izinleri\n\nDosyalara veya dizinlere erişime izin vermek veya vermemek için kullanılan izinler aşağıdaki gibidir; \u003c/br\u003e\nÜç tür izin vardır :\u003c/br\u003e\n- Oku (r)\n- Yaz (w)\n- Yürüt (x) (örneğin dosyalarda arama yapmak)\n\nİzinler üç düzeyde verilebilir:\u003c/br\u003e\n- Kullanıcı (u)\n- Grup (g)\n- Diğer (o)\n\n- chmod \u003cmode\u003e \u003cfile(s)\u003e  komutu \n \n  ![foto4](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-2/photo4.png)\n\nchmod 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; \u003c/br\u003e\nDaha çok kullanılan sayılar kullanılarak verilen izinlerdir sayılar belirli bir düzene göre verilebilir;\n- r=4\tw=2\tx=1\n\nchmod 200 a.txt \tyazarsak a dosyasında kullanıcıya sadece yazma hakkı verilir, grup ve diğer(herkese) herhangi bir yetki verilmez.\u003c/br\u003e\nchmod 635 a.txt\t\tyazarsak kullanıcıya okuma ve yazma, gruplara yazma ve calıstırma, herkese okuma ve calıstırma izni vermiş oluruz.\u003c/br\u003e\nikinci kullanım şeklinde grup için g,kullanıcı için u, digerleri icin o harfleri kullanılır.\u003c/br\u003e\nchmod g-r a.txt \tyazarsak gruplardan okuma yetkisini alır veya benzer şekilde g+rw yazarsak gruplara okuma yazma yetkisi veririz.\u003c/br\u003e\n\n- chgrp komutu\n\nchgrp asd a.txt\t\tyazarak a.txt dosyasının grubunu değiştirerek asd grubuna alabiliriz.\n\n- chown komutu \n\nchown hkn a.txt\t\tyazarak a.txt dosyasını başka bir kullanıcıdan alıp hkn kullanıcısına verebiliriz.\n\n\n### Dosyanın içeriğine bakmak\n\n- cat komutu\n\ncat komutunu dosyaların içeriğine bakmak veya içeriğini değiştirmek için kullanılır. \u003c/br\u003e\ncat 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 \u003e\u003e 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.\n\n- more komutu\n\nUzun 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.\n\nHerhangi bir satır numarasından itibaren veri çekme işlemi; \u003c/br\u003e\nmore +satir_numarası  dosya_adi  şeklinde olmaktadır.\n\nBelirli bir kelime ile başlayan satırı içeren kısımdan itibaren veri çekme işlemi; \u003c/br\u003e\nmore  +/\"kelime\"   dosya_adi şeklinde olmaktadır. \n\n\n- less komutu \n\n\"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.\n\nKomutları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, \"\u0026 /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. \u003c/br\u003e\n\"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.\n\n\n### Wildcards(joker karakterler)(Globbing)\n\nLinux 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.\u003c/br\u003e\n\ncp ~/workspace/*.cfg ~/workspace2\n\n-  *Bütün karakterler, çoğul seçim\n- ?\t Herhangi bir karakter, tekil seçim\n- [karakterler]\t Karakter kümesi, veya operatörü ile çalışır.\n- [!karakterler]\t Karakter kümesi haricinde demektir.\n- [[:sınıf:]]\t Belirtilen bir karakter sınıfına ait olan eşleşme. Karakter sınıfları bir sonraki tabloda anlatılmaktadır.\n\nörnekler; \u003c/br\u003e\n\n*.cfg -\u003e Sonu .cfg ile biten dosyalar\n\nA*.cfg -\u003e A ile başlayan Sonu .cfg ile biten dosyalar\n\n???.txt-\u003e 3 harfli olup sonu .txt ile biten dosyalar\n\n[abc]* veya [a-c]-\u003e 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.\n\nVersion.[:digit:] [:digit:] -\u003e Version.rakam rakam formatındaki dosyalar\n\n*[[:upper:]] -\u003e Sonu buyuk harfli biten dosyalar\n\n### Unix komutlarında yardım almak\n\n- man \u003ccommand_name\u003e komutu\n\nBu komut ile herhangi bir komut hakkında detaylı bir dökümana erişebiliyoruz. Komutun tüm belgelerini gösterir.\n\n- apropos \u003ckeyword\u003e komutu\n \n Belirtilen anahtar kelimeyle birlikte komutların tümünü açıklamalarında gösterir. apropos yerine  man -k  'da kullanılabilir.\n \n - type \u003cstring\u003e\n \n komutun sistem yolunu verir.\n \n ### Diğer dosya sistemleri \n \nSunOS'ta 3 farklı dosya sistemi vardır\n\n- Disk tabanlı\n- Dağıtılmış\n- Sözde(pseudo)\n\nDisk tabanlı dosya sistemleri sabit diskler, CDROM'lar, disketler içerir. \u003c/br\u003e\nDağıtılmış dosya sistemleri ağ kaynaklarını yönetir. \u003c/br\u003e\nSözde dosya sistemleri bellek tabanlıdır ve disk alanı kullanmaz \u003c/br\u003e\n\n\n\n## Bölüm-3 Text Editing\n\nŞimdiye kadar dosya sistemindeki dosyaları değiştirdik (cp, mv, rm, ln) ve içeriğini (cat, daha az) görüntüledik. \u003c/br\u003e\nDosyaların içeriğini nasıl düzenlersiniz?\nUnix editörleri düz ASCII metin dosyalarıyla çalışır: vi, emacs, pico.\n\n### Neden vi?\nKullanılabilirlik\n- Herhangi bir Unix / Linux sisteminde çalışabilir.\n\nKomutlar anahtarlardır.\n\n- Uzaktan oturum açma yoluyla erişilebilir (ör. Ssh).\n- Fare kullanımını önler.\n\nBasit ve güçlü bir metin editörü.\n\nviden baska emacs,pico gibi editörlerde vardır\nvi uzakdan erişim ile teriminale bağlanabilir.\n\n- vi yazarak editörü açabiliriz\n- :help yazarak vi editörü hakkında detaylı bir bilgiye ulaşabiliriz\n- :q! ile çıkabiliriz\n- vi deneme.txt  diyerek bir deneme dosyasını editörde açabiliriz. \u003c/br\u003e\n\niki modu vardır.\n- 1. command modu: komutlar icra edilir. ilk açıldığında bu moddadır\n- 2. insert modu: dosya iceriği düzenlemesi yapılır. esc'ye basınca komut moduna geceriz.\n\nüç komut modu var biri normal, ikincisi :'dan sonraki komutu, üçüncüsü i modu yani yazma modu\n- escape tuşu ile geri gelebiliriz\n\ninsert modunda(i'e basınca) backspace ile silebiliriz ama insert modunun dışında x ile veya shift-x ilede silebiliriz.\nshift+c alt satırla üst satırı birleştirir\n\n### cursor hareketi:\nyön tuşları veya h sol j asağı k yukarı l ise sağ yönde hareket etmemizi sağlar\u003c/br\u003e\n4j yazınca 4 satır aşağıya gider\u003c/br\u003e\nCTRL-F sonraki sayfa\u003c/br\u003e\nu (undo) yazarsak son değişikliği iptal eder \u003c/br\u003e\n:7 yazarsak direk 7.satıra gider \u003c/br\u003e\nx  cursorun üzerinde olduğu karekteri siler.(imlecin üzerindeki karekteri)\u003c/br\u003e\ndd , D  yazarsak cursorun üzerinde olduğu satırı siler\u003c/br\u003e\ncc ,C \tcursor üzerinde oldugu kelimeyi değiştirir\u003c/br\u003e\nrx\tkarakteri x ile yer değiştirir \u003c/br\u003e\nyy\tbir satırın kopyasını alır \u003c/br\u003e\np\tyapıstırır \u003c/br\u003e \nj\tüzerinde bulundugu satır ve alt satırı birleştirir. \u003c/br\u003e\n/bil yazarsak ilk bil yazan yeri bulur //bil ikinci bil yazan yeri bulur \u003c/br\u003e\n?bil yazarsak bu sefer yukarıya doğru arar \u003c/br\u003e\n\n### file operation:\nwq\t write quit (kaydeder ve çıkar) \u003c/br\u003e\nw\t sadece write \u003c/br\u003e\nw  filename \tdosyaya yaz \u003c/br\u003e \nq!\t değişiklik olsa bile değiştirmeden çıkabilirz \u003c/br\u003e\ne filename\t editöre dosyayı yükle \u003c/br\u003e\nr filename \tcursor'ın oldugu satırdan itibaren dosyanın oldugu satıra ekle \u003c/br\u003e\nen son :W yazarsak dosyayı yazar :w! yazarsak üzerine yazar \u003c/br\u003e\n: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 \u003c/br\u003e\ndaha fazla detay için :help dışında http://www.belgeler.org/lis/archive-tlkg-lis-7.2.html kullanılabilir. \u003c/br\u003e\n\n### arama:\n/kelime\t ileri doğru ara \u003c/br\u003e\n?kelime  geri doğru ara\u003c/br\u003e\nn  son aranan tekrar\u003c/br\u003e\nN  son aranan tersi yönde tekrar\u003c/br\u003e\n\n\n\n## Bölüm-4 Shell operatörleri\n\n### Üç standart dosya\n\n- stdin , standart giriş\n\ngiriş karakter akışı, varsayılan giriş klavye'dir.\n\n- stdout , standart çıkış\n\nçıkış karakter akışı, varsayılan çıkış terminaldir.\n\n- stderr , standart hata(error)\n\nhata mesajlarını alır, varsayılan olarak terminal ayarlıdır.\n\n### stdout yönlendirme\n\nstdout'u terminale yönlendirmek yerine bir programı bir dosyaya yazmasını söyleyebilirsiniz. \u003c/br\u003e\n\\\u003efilename : stdout'u bir dosyaya yönlendirir.Eğer dosya yoksa dosyayı oluşturur.Eğer dosya varsa dosyayı sıfırlar.\u003c/br\u003e\n\\\u003e\u003efilename : varolan bir dosyaya stdout ekler. örneğin; \u003c/br\u003e\nman ls \u003e ls_help.txt (man ls komutunun cıktısını terminale yazdırmak yerine belirlenen dosyaya yazar)\u003c/br\u003e\necho $PWD \u003e current_directory \u003c/br\u003e\ncat file1 \u003e\u003e file2 (file1 dosyasını file2ye yazar ama file2deki mevcut bilgiyi korur üstüne yazmaz dosyanın devamına yazar.)\n\n### stdin yönlendirme\n\nstdin'in terminalden okumak yerine bir dosyadan okumasını söyleyebiliriz. \u003c/br\u003e\n\u003cfilename : stdin'i mevcut bir dosyaya yönlendirir. \u003c/br\u003e \n\u003c\u003ckelime  : takip eden satırlandarn sadece kelime'yi içeren satırada kadar, stdin'i yönlendirir. örneğin; \u003c/br\u003e\nmail user@domain.com \u003c message.txt \u003c/br\u003e\nat 3am \u003c cmds or at 0945 \u003c cmds \u003c/br\u003e\nsort \u003c friends \u003e sorted_friends \u003c/br\u003e\ncat \u003c\u003c 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)\u003c/br\u003e\n\n### Standart dosya tanımlayıcıları\n\nBir dosya bir tanımlayıcı ile ilişkilendirilebilir. \u003c/br\u003e\nKabuk(shell), sırasıyla her bir komut için üç standart dosyayı üç standart dosya tanımlayıcısı ile ilişkilendirir.\u003c/br\u003e\n- 0 : standard input (STDIN)\n- 1 : standard output (STDOUT)\n- 2 : standard error (STDERR)\n\nStandart tanımlayıcılar, kullanıcının terminali ile ilişkilendirilir, ancak başka dosyalara da yönlendirilebilirler.\n\n### Dosya tanımlayıcı oluşturma\n\nYazmak üzere bir dosyayı açmak için bunlardan birini kullanın. \u003c/br\u003e\nexec n\u003e filename (dosyayı yazma işlemi için açıyoruz , yazma işlemi kullanıldığında n dosya tanımlayıcıyı oluşturuyor. \u003c/br\u003e\nexec n\u003e\u003e filename (sonundan itibaren yazmak üzere n oluşturuluyor)\u003c/br\u003e\nn bir tamsayıdır ve dosya adı, yazmak için açılan dosyanın adıdır. \u003c/br\u003e\nİlk form, eğer böyle bir dosya varsa, belirtilen dosyanın üzerine yazar. \u003c/br\u003e\nİkinci form belirtilen dosya adına eklenir. \u003c/br\u003e\nBir dosyayı okumak üzere açmak için \u003c/br\u003e\nexec n\u003cfilename (okuma işlemi için açılıyor, okumak için n'nin file nesnesi oluşturuluyor)\u003c/br\u003e\nHem okuma hem de yazma için bir dosyayı açmak için \u003c/br\u003e\nexec n\u003c\u003e filename (n adında dosya tanımlayıcısı oluşturuluru)\u003c/br\u003e\n\n### Dosya Tanımlayıcıları ile Yönlendirme\n\nStandart çıktıyı, dosya tanıtıcısı n ile ilişkilendirilmiş dosyaya yönlendirmek için,\u003c/br\u003e\nkomut\u003e\u0026 n (n bağlı olduğu dosyaya yazıyor, terminalde yazılacak veri n'nin bağlı olduğu dosyaya yazılır) \u003c/br\u003e\nStandart girişi, dosya tanımlayıcısı n ile ilişkilendirilmiş dosyadan yönlendirmek için,\u003c/br\u003e\nkomut\u003c\u0026n (komut bilmez veriyi nereden aldığını) \u003c/br\u003e\nexec n\u003e \u0026 -: çıktı dosyası tanımlayıcısı n kapalı.\n    exec 1\u003e\u0026- , exec\u003e\u0026-: standart çıkış kapalı.\nexec n \u003c\u0026 -: giriş dosyası tanımlayıcısı n kapalı.\n    exec 0\u003c\u0026- , exec\u003c\u0026-: standart giriş kapalı.\n    \n    \nBir dosyaya yazma; \u003c/br\u003e\nexec 4\u003e dosya  (\"dosya\" yı açın, fd 4 atayın.) \u003c/br\u003e\nls\u003e \u0026 4   (ls çıktısını \"dosya\" ya yaz)\u003c/br\u003e\n\nBir dosyadan okuma  \u003c/br\u003e\nexec 5 \u003cdosya  (\"dosya\" yı açın, fd 4 atayın.)  \u003c/br\u003e\nwc \u003c\u0026 5   (\"dosya\" dan giriş oku)  \u003c/br\u003e\n\nBir dosyada belirtilen bir yere yazma  \u003c/br\u003e\necho 1234567890 \u003e dosya  (\"dosya\" ya dize yaz.) \u003c/br\u003e \nexec 3\u003c\u003e dosya  (\"dosya\" yı açın, ona fd 3'ü atayın.)\u003c/br\u003e\nread -n 4 \u003c\u00263  ( Sadece 4 karakter oku.) \u003c/br\u003e\necho -n . \u003e\u00263   (Oraya bir ondalık işareti yazın.) \u003c/br\u003e\nexec 3\u003e\u0026-  (fd 3'ü kapatın.) \u003c/br\u003e\ncat dosya    ( ==\u003e 1234.67890) \u003c/br\u003e\n\n### Genel Giriş / Çıkış Yönlendirme\nStandart çıkış veya giriş yönlendirmesi açıkça aşağıdaki genel şekilde belirtilir. \u003c/br\u003e \n- komut 1\u003edosya \n- komut 1\u003e\u003edosya \n- komut 0\u003cdosya \n\nSTDOUT ve STDERR dosyalarını ayrı ayrı dosyalara  yönlendirmek için kullanılan temel sözdizimi; \u003c/br\u003e\n- komut 1\u003edosyaA 2\u003edosyaB \u003c/br\u003e\nBelirtilen komutun STDOUT dosyası A dosyasına yönlendirilir ve STDERR (hata mesajları) fileB dosyasına yönlendirilir.\n\n### Ayrı Dosyaları Yeniden Yönlendirme\n\n- komut \u003e\u003e dosyaA 2\u003e dosyaB\n- komut \u003e fileA 2 \u003e\u003e fileB\n- komut  \u003e\u003e dosyaA 2 \u003e\u003e dosyaB\n\nİlk form STDOUT dosyasını fileA'ya ekler ve STDERR'yi fileB'ye yönlendirir. \u003c/br\u003e\nİkinci form STDOUT'u fileA'ya yönlendirir ve STDERR'yi fileB'ye ekler. \u003c/br\u003e\nÜçüncü form STDOUT dosyasını fileA'ya ekler ve STDERR'yi fileB'ye ekler. \u003c/br\u003e\n\n### Tek Bir Dosyaya Yönlendirme.\n\nAynı dosyaya STDOUT ve STDERR yönlendirmek veya eklemek için temel sözdizimi; \u003c/br\u003e\nkomut \u003efile2\u003e\u00261 veya command \u0026\u003e file \u003c/br\u003e\nkomut \u003e\u003efile2\u003e\u00261 \u003c/br\u003e\nSTDOUT (dosya tanımlayıcısı 1) ve STDERR (dosya tanımlayıcısı 2) belirtilen dosyaya yönlendirilir veya eklenir. \u003c/br\u003e\nkomut 2\u003e\u00261\u003e\u003efile (bunu yukarıdakiyle karşılaştır). \u003c/br\u003e\n\nm\u003e \u0026 n: dosya tanımlayıcıları m, n'ye yönlendirilir. \u003c/br\u003e\n  \u003e\u0026n: standart çıkışı n dosya tanımlayıcısına yönlendirilir\nÖrnek; \u003c/br\u003e\nrm -rf /tmp/my_tmp_dir \u003e /dev/null 2\u003e\u00261\nrdate ntp.nasa.gov \u003e\u003e /var/log/rdate.log 2\u003e\u00261\nif [ ! -f $FILE ]; then echo \"$FILE is not a file\" \u003e\u00262; fi\n\n### Pipes ( veri yolu)\n\nPipe (|): Bir komutun stdout'unu diğerinin stdinine bağlar. \u003c/br\u003e\nÖrnekler; \u003c/br\u003e\n\nls –la | less \u003c/br\u003e\nls –al | wc \u003c/br\u003e\nls-al | sort +4r \u003c/br\u003e\ncat file | wc \u003c/br\u003e\nman bash | grep \"history\" \u003c/br\u003e\nps aux | grep user1 | wc –l \u003c/br\u003e\n\n\n### Süreçler(Processes)\n\nBir seferde birden fazla program çalıştırmak için;. \u003c/br\u003e\nNoktalı virgülle (;) ayrı komutlar yazılabilir  \u003c/br\u003e\n- date; who  (sıralı bir şekilde koşar)\n\nAynı anda birden fazla program çalıştırmak için; \u003c/br\u003e\nKomutun sonunda ve işaretini (\u0026) kullanın. \u003c/br\u003e\nls -al \u0026 wc *  (paralel bir şekilde koşar hangisinin nezaman biteceği kesin değildir.) \u003c/br\u003e\n\n### Filtreler ( Filters)\n\nFiltre,girişi alan ve bir şekilde dönüştüren bir programdır.\n\n- wc komutu \u003c/br\u003e\nwc , satır / sözcük / karakter sayısı verir \u003c/br\u003e\n\n- grep komutu \u003c/br\u003e\ngrep , belirli bir örneğe sahip hatları arar \u003c/br\u003e\ngrep \u003cpattern\u003e \u003cfilename\u003e (örnek RE olabilir) \u003c/br\u003e\n \n- sort komutu \u003c/br\u003e\nsort , satırları alfabetik veya sayısal olarak sıralar \u003c/br\u003e \nsort -r: normal sıralama düzenini tersine çevirir \u003c/br\u003e \nsort -n: sayısal sırada sıralar \u003c/br\u003e \nsort + 2n: ikinci sütundaki öğeleri sıralar\u003c/br\u003e\n\n- cut komutu \u003c/br\u003e\ncut - stdout'a gönderilecek her satırın parçalarını seçer. \u003c/br\u003e\ncut -c1-5: her satırın ilk 5 karakterini seç \u003c/br\u003e \ncut -c1,5: her satırın ilk ve beşinci karakterlerini seç \u003c/br\u003e \ncut -d: -f1,3 /etc/passwd: kullanıcı adlarını ID'leriyle eşleştir \u003c/br\u003e\n\n- head komutu \u003c/br\u003e\nhead , dosyaların ilk birkaç satırını gösterir. \u003c/br\u003e\nhead -n \u003cdosyaadı\u003e    , n: bir tam sayı \u003c/br\u003e\n\n- tail komutu \u003c/br\u003e\ntail , dosyanın son bölümünü görüntüler \u003c/br\u003e\ntail -n \u003cdosyaadı\u003e : son n satırı . \u003c/br\u003e\ntail + n \u003cdosyaadı\u003e: n. satırdan sonraki satırlar \u003c/br\u003e\n\n- diff komutu \u003c/br\u003e\ndiff ,farklı olan tüm satırları gösterir. \u003c/br\u003e\n\n- cmp komutu \u003c/br\u003e\ncmp , iki dosyanın farklı olduğu ilk yeri bul \u003c/br\u003e\n\u003cdiff / cmp\u003e \u003cdosya1\u003e \u003cdosya2\u003e   \u003c/br\u003e\n\n- od komutu \u003c/br\u003e\nod , Bir dosyanın içeriğini sekizlik(oktal) gösterimini gösterir. \u003c/br\u003e\nÖrneğin. od –c: tüm baytların görsel gösterimi \u003c/br\u003e\n\n- ls -lt komutu \u003c/br\u003e\nls –lt , zaman sırasına göre dosya listesi \u003c/br\u003e\n\n- crypt komutu \u003c/br\u003e\ncrypt , bir dosyayı kodlama veya kod çözme \u003c/br\u003e\nÖrneğin. şifreli anahtar \u003cclear.file\u003e encrypted.file \u003c/br\u003e\n\n- tr komutu \u003c/br\u003e\ntr , girişindeki karakterleri çevirir. \u003c/br\u003e\ntr \"[: lower:]\" \"[: upper:]\" \u003c \u003cdosya\u003e    (dosyadaki küçük harfleri büyük harflere çevirir.)\u003c/br\u003e\n \n- uniq komutu \u003c/br\u003e\nuniq , bir dosyadaki tekrarlanan satırları rapor eder veya filtreler. \u003c/br\u003e\nuniq –d \u003cdosya\u003e    , \u003cdosya\u003e 'da tekrarlanan satırları görüntüleme \u003c/br\u003e\nuniq –u \u003cdosya\u003e    , \u003cdosya\u003e da tekrarlanmayan ekran satırları görüntüleme  \u003c/br\u003e \nuniq –c \u003cdosya\u003e    , \u003cdosya\u003e 'daki tekrarlanan satırları tekrar sayılarıyla birlikte görüntüleme \u003c/br\u003e\n\n\n- pr komutu \u003c/br\u003e\npr , dosyaları çeşitli şekillerde yazdırır.\nls -a | pr -n -h $ (pwd) , geçerli dizindeki tüm dosyaların numaralandırılmış bir listesini yazdırır.\n\n\nAşağıdaki komut ne yapar?\ncat * | tr -sc A-Za-z '\\012' | sort | uniq –c | sort –n | tail | pr -5 –t\n\n### Communication(iletişim) komutları\n\n- talk komutu\u003c/br\u003e\ntalk ,sisteme kayitli olan baska bir kullanici ile etkileşimli sohbet\u003c/br\u003e\nÖrneğin. talk hakan pts/2 \u003c/br\u003e\n- write komutu  \u003c/br\u003e \nwrite, başka bir kullanıcıya mesaj gönderme\u003c/br\u003e \nÖrneğin. write hakan pts/2  \u003c/br\u003e \nmesg [n | y] :  mesajlara izin ver / reddet\u003c/br\u003e \n\n- mail, pine : text tabanlı e-posta programı \u003c/br\u003e\n- ftp, sftp : metin tabanlı FTP programı \u003c/br\u003e\n- telnet, ssh : doğrudan diğer makinelere bağlanmak için kullanılır \u003c/br\u003e\n- lynx : metin tabanlı web tarayıcısı \u003c/br\u003e\n\n### Processes(süreçler) komutları\n- ps komutu \u003c/br\u003e\nps , mevcut süreçleri listeler \u003c/br\u003e\n\n- top komutu \u003c/br\u003e\ntop , sistemin süreçler tarafından kullanımının dinamik gösterimini yapar\n\n- kill komutu \u003c/br\u003e\nkill , belirlenen bir süreci sonlandır (varsayılan: SIGTERM) \u003c/br\u003e\nkill –9 \u003cpid\u003e (SIGKILL sinyali gönderiliyor)\u003c/br\u003e\n\n- time komutu \u003c/br\u003e\ntime,  bir süreç için zamanlama bilgisini tutar ve gösterir. \u003c/br\u003e\ntime ls (real / user / sys zamanı gösteriliyor).\u003c/br\u003e\n\n- wait komutu \u003c/br\u003e\nwait , \u0026 ile başlayan tüm işlemleri bekliyor.(belli bir işlemi bekleme) \u003c/br\u003e\n\n- nohup komutu \u003c/br\u003e\nnohup , oturumu kapattıktan sonra komutu çalıştırmaya devam ettirir.\n\n- nice komutu \u003c/br\u003e\nnice , komutu düşük öncelikle çalıştırmaya devam et. \u003c/br\u003e\nnohup / nice \u003ckomut\u003e \u0026\n\n### Daha fazla dosya sistemi komutları\n\n- file komutu  \u003c/br\u003e\nfile , dosya türünü belirler(gösterir)  \u003c/br\u003e\nfile /bin/ed  \u003c/br\u003e\n/bin/ed: saf çalıştırılabilir  \u003c/br\u003e\n\nÇalıştırılabilir binary bir program, başında \"sihirli sayı\" ile işaretlenmiştir.  \u003c/br\u003e\nod / bin / ed  \u003c/br\u003e\n0000000 **077505** 046106 000402 000400 000000  \u003c/br\u003e\n\n- du komutu  \u003c/br\u003e \ndu , ne kadar disk alanı kullandığını gösterir.  \u003c/br\u003e\ndu \u003cdosya / dizin\u003e    (disk blokları cinsinden)  \u003c/br\u003e\n\n- df komutu \ndf , bağlı dosya alt sistemlerindeki alanı gösterir.  \u003c/br\u003e\ndf –k   (disk blokları cinsinden) (bir blok = 512 veya 1024 bayt)  \u003c/br\u003e\n\n\n\n## Bölüm-5 Regular Expressions(Düzenli ifadeler)\n\n### RE kullanan UNIX Programları\n\n- grep   (dosya içinde ara).\n- egrep   (genişletilmiş RE'ler ile grep).\n- vi / emacs   (metin editörleri).\n- ex   (çizgi(line) editörü).\n- sed   (akış(stream) editörü).\n- awk   (örüntü(pattern) tarama dili).\n- perl   (betik dili).\n\n\n### Temel ve Genişletilmiş RE'ler\n\nTemel düzenli ifadelerde; \u003c/br\u003e \nmeta karakterleri ?, +, {,}, (,), |, ve ) özel bir anlamı yoktur (grep) \u003c/br\u003e\n  Onlara özel bir anlam vermek için kaçış versiyonlarını kullanın: \\?, \\+, \\{, \\}, \\(, \\) ve \\| \u003c/br\u003e\n  \nGenişletilmiş düzenli ifadeler kullanıldığında, bu meta karakterlerin özel bir anlamı vardır \u003c/br\u003e\n  grep –E = egrep \u003c/br\u003e\n\n### egrep kullanımı \n\negrep pattern filename(s)\n\nGüvenli olmasu için, pattern(model) çevresine tırnak işaretleri yerleştirin.\nÖrnekler: \u003c/br\u003e\negrep \"abc\" textfile \u003c/br\u003e\n(dosyada “abc” içeren satırları yazdırır) \u003c/br\u003e\negrep -i \"abc\" textfile \u003c/br\u003e\n(yukardakiyle aynı, ancak büyük/küçük harf farkını yoksayar ikisinide gösterir.) \u003c/br\u003e\negrep -v \"abc\" textfile \u003c/br\u003e\n(dosyada “abc” içermeyen satırları yazdırır) \u003c/br\u003e\negrep -n \"abc\" textfile \u003c/br\u003e\n(satır numaralarını ile beraber yazdırır) \u003c/br\u003e\negrep -c \"abc\" textfile \u003c/br\u003e\n(dosyada “abc” içeren satır sayısı yazdırır) \u003c/br\u003e\n\n### Metacharacters (Özel karakterler)\n\n- Nokta(period)(.): Herhangi bir karakterle eşleştirir. \u003c/br\u003e  \n“a.c”   abc, adc, a\u0026c, a;c, ... ile eşleşir \u003c/br\u003e\n“u..x”  unix, uvax, u3(x, ...ile eşleşir \u003c/br\u003e\n\n- Yıldız işareti(*): önceki RE'nin sıfır veya daha fazla oluşumuyla eşleşir. \u003c/br\u003e  \nKabuktaki joker karakterlerle(wilcards) aynı değildir! \u003c/br\u003e  \n“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 )\u003c/br\u003e  \n“. *” Herhangi bir string'le eşleşir. \u003c/br\u003e  \n\n- Artı(+): önceki RE'nin bir veya daha fazla tekrarını eşleştirir \u003c/br\u003e \n“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 )\u003c/br\u003e \n\n- Soru işareti (?): Önceki RE'nin sıfır veya bir tekrarı ile eşleşir \u003c/br\u003e \n“ab?c” ac, abc ile eşleşir ancak abbc ile eşleşmez \u003c/br\u003e  \n\n- Mantıksal veya (|): bar öncesi RE veya bar sonrası RE ile eşleşir \u003c/br\u003e \n“abc | def”, abc veya def ile eşleşir \u003c/br\u003e \n\n- Şapka (^): satırın başlangıcı anlamına gelir \u003c/br\u003e\n“^D.*”, D ile başlayan bir satırla eşleşir \u003c/br\u003e\n\n- Dolar işareti ($) satır sonu anlamına gelir \u003c/br\u003e\n“.*d$”, d ile biten bir satırla eşleşir\n\n- Ters eğik çizgi (\\\\): diğer meta karakterlerden kaçar yani meta karakterler ile normal karakterlerin karışmasını önler\u003c/br\u003e \n“file\\\\.txt”, file.txt ile eşleşiyor ancak file_txt ile eşleşmiyor\u003c/br\u003e\n\n- Köşeli parantez ([]): bir karakter kümesi listesini belirtir. \u003c/br\u003e\nkümedeki herhangi bir karakter eşleşecek \u003c/br\u003e\n^ 'den sonraki karakterler ile eşleşmeyecek . \u003c/br\u003e\n-bir karakter aralığını belirtir. \u003c/br\u003e\nÖrnekler:\u003c/br\u003e\n \n“[fF]un” fun,Fun ile eşleşir. Yani F yada f olmalı. \u003c/br\u003e\n“b[aeiou]g” bag, beg, big, bog, bug ile eşleşiyor. \u003c/br\u003e \n“[A-Z].*”, Büyük harfle başlayan bir dizeyle eşleşir \u003c/br\u003e\n“[^Abc].*”  a, b veya c ile başlamayan dizelerle eşleşir \u003c/br\u003e\n\n- Parantezler (()): gruplamak için kullanılır.\u003c/br\u003e\n\n“a(bc)*” ifadesi a, abc, abcbc, abcbcbc, ... ile eşleşir.\u003c/br\u003e\n“(foot|base)ball” football ya da baseball ile eşleşir\u003c/br\u003e\n\n- Süslü Parantez ({}): bir RE'nin tekrar sayısını belirtmede kullanılır. \u003c/br\u003e\n\n“[a-z]{3}” üç küçük harfle eşleşiyor.Yani en az üç küçük harf barındırıyorsa \u003c/br\u003e\n“m.{2,4}” dizeleri m ve ardından 2 ile 4 karakter arasında eşleştirir. \u003c/br\u003e\n\n\n### Bunlar ne anlama geliyor?\n\nÖrnekler \u003c/br\u003e \negrep ”^B.*s$” dosya \u003c/br\u003e\negrep ”[0-9]{3}” dosya \u003c/br\u003e\negrep ”num(ber)? [0-9]+” dosya \u003c/br\u003e\negrep ”word” dosya | wc -l \u003c/br\u003e\negrep ”[A-Z].*\\?” dosya \u003c/br\u003e\nls -l | egrep \"^....r.-r.-\" \u003c/br\u003e\n\nYa grep kullanılırsa?\nEn az iki 0 içeren kullanıcı kimliğine sahip kullanıcıları arayın \u003c/br\u003e\n  grep \"^[^:]*:[^:]*:[^:]*0[^:]*0[^:]*:.*\" /etc/passwd \u003c/br\u003e\n\n/etc/passwd dosya formatı; \u003c/br\u003e\n\\\u003cusername\u003e:\\x:\\\u003cuserid\u003e:\\\u003cgroupid\u003e:\\\u003cuseridinfo\u003e:\\\u003chomedir\u003e:\\\u003cloginshell\u003e \u003c/br\u003e\nx karakteri, şifreli parolanın /etc/shadow dosyasında saklandığını gösterir. \u003c/br\u003e\n\n\n### Egrep ile kelime arama \n\nSistem yazım denetimi için küçük bir sözlüğe sahip olabilir:/usr/dict/words  \u003c/br\u003e\nBeş sesli harfin tümünü içeren kelimeleri alfabetik sırayla bulun. \u003c/br\u003e\n\ncat alphvowels.\u003c/br\u003e\n^[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*$ \u003c/br\u003e\negrep -f alphvowels /usr/dict/words \u003c/br\u003e\n\nHarfleri alfabetik sırada olan altı veya daha fazla harften oluşan tüm kelimeleri bulun. \u003c/br\u003e\ncat \u003e monotonic \u003c/br\u003e\n^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?$ \u003c/br\u003e\negrep -f monotonic /usr/dict/words | grep \"......\" \u003c/br\u003e\n\npratik:  \u003c/br\u003e\nEn az 10 karakterden oluşan bir sözcükle başlayan satırlar. \u003c/br\u003e\nStandart 3 bölümlü formda öğrenci kimliği içeren satırlar. \u003c/br\u003e\nArdışık 2 büyük harfli sözcük içeren satır sayısı. \u003c/br\u003e\nAlfabetik karakterle bitmeyen satır sayısı. \u003c/br\u003e\nBir cümlenin sonunda sesli harfle başlayan bir kelimeyi içeren satırlar. \u003c/br\u003e\n\n\n## Bölüm-6 UNIX Kabuk Ortamları\n\n### Kabuk özellikleri\n\nKullanıcı ve işletim sistemi arasındaki komut satırı arayüzüdür. \u003c/br\u003e\nGiriş sırasında otomatik olarak başlar. \u003c/br\u003e\nHem komut yorumlayıcısı hem de programlama dilidir. \u003c/br\u003e\nKabuk betiği(Shell script), kabuk yorumlaması için mantık içeren bir metin dosyasıdır. \u003c/br\u003e\n\n### Kabuk Etkileşimi\n\n- Komut satırı ayrıştırma(parsing)  \u003c/br\u003e\n- Ortam \u003c/br\u003e\n- Metin tamamlama (tab tuşu ile) \u003c/br\u003e\n- Takma adlar.(Aliases) \u003c/br\u003e\n- Komut satırı düzenleme \u003c/br\u003e\n- Komut geçmişi \u003c/br\u003e\n- Yapılandırma. \u003c/br\u003e\n\n### Kabuk Programlama\n\n- Değişkenler\n- Kontrol Yapıları (Döngüler ve şartlamalar).\n- Fonksiton tanımı ve çağırma.\n- Kabuk betiği(scripts).\n- Sonraki bölüm.\n\n### Çeşitli Unix Kabukları\n\n- sh (Bourne kabuğu, orijinal Unix kabuğu)\n- ksh (Korn kabuğu)\n- csh (Berkeley'de geliştirilen C kabuğu)\n- tcsh\n- bash (Bourne Kabuğu.) Linux'ta varsayılan kullanıcı kabuğu\n...\nÇoğunlukla etkileşim düzeyindeki farklılıklar desteklenir. \u003c/br\u003e\nhttp://www.faqs.org/faqs/unix-faq/shell/shell-differences/ \u003c/br\u003e\n\n### Kabuk Özellikleri. \n![foto1](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-6/photo1.png)\n\n### Bourne Again SHell (bash)\n\nBash bu döküman için standart kabuktur.  \u003c/br\u003e\nBourne kabuğunun üst kümesidir(sh).  \u003c/br\u003e\nSh, csh, tcsh \u0026 ksh'dan ödünç alınan özellikler vardır.  \u003c/br\u003e\nGNU projesinin bir parçasıdır.  \u003c/br\u003e\n\n### Değişkenler\n\nÇalışan bir kabuk için üç ana değişken türü vardır; \u003c/br\u003e\n\nYerel(local) değişkenler; \u003c/br\u003e\nŞu anki kabuğun içinde mevcut olan değişkenlerdir.\nKomut isteminde, değişkene değer atanır. \u003c/br\u003e\n\nOrtam(environment) Değişkenleri; \u003c/br\u003e\nHerhangi bir alt kabuk işlemi(child process) için kullanılabilir\u003c/br\u003e\n\nKabuk değişkenleri; \u003c/br\u003e\n Kabuk tarafından değer atanması(set) gerekir. \u003c/br\u003e\n \n### Kabuk Değişkenleri\n\nKabuğun belirli işlemler için kullandığı değişkenler kümesidir. \u003c/br\u003e\nKabuk değişkenleri şunları içerir: \u003c/br\u003e\n- yerel değişkenler\n- Ortam Değişkenleri\n\n\u003c/br\u003e \n\n- env komutu \u003c/br\u003e\n\nGeçerli ortam değişkenlerinin listesi, env komutu ile görüntülenebilir. \u003c/br\u003e\nDeğ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. \u003c/br\u003e\n\n\n### Ortam Değişkenleri\n\nBazı ilginç değişkenler: HOME, PWD,PATH, PS1, USER, HOSTNAME \u003c/br\u003e\n$ HOME: home dizini (cd için varsayılan değişken)\u003c/br\u003e\nÖrnek: /home/0607/student \u003c/br\u003e\n$ PWD: mevcut çalışma dizini \u003c/br\u003e\nÖrnek: /export/home/staff/usern \u003c/br\u003e\n$ PATH: komutlar için arama yolu \u003c/br\u003e\nÖrnek: /usr/local/bin:/bin:/usr/bin \u003c/br\u003e\n$ PS1: komut istemi (varsayılan “$”) \u003c/br\u003e\nÖrnek: \\u@\\h:\\w\\$ \u003c/br\u003e \n$ USER: kullanıcı adı \u003c/br\u003e\nÖrnek: usern \u003c/br\u003e\n$ HOSTNAME: bilgisayar hostname \u003c/br\u003e\nÖrnek: ktuce \u003c/br\u003e\n\nDiğer ilginç değişkenler: UID, PPID, RANDOM, HISTFILE, HISTSIZE, MAIL, MAILCHECK, PS2 \u003c/br\u003e\n$ UID: mevcut kullanıcı kimliği \u003c/br\u003e \n$ PPID: Kabuğu çalıştıran programın işlem kimliği \u003c/br\u003e \n$ RANDOM: 0-32767 arasında rastgele bir tam sayı oluşturur \u003c/br\u003e\n$ HISTFILE: komut geçmişini saklamak için dosya \u003c/br\u003e\n$ HISTSIZE: saklanacak komut sayısı \u003c/br\u003e\n$ POSTA: posta gelmişmi diye kabuk tarafından kontrol edilen dosya \u003c/br\u003e\n$ MAILCHECK: kontroller arasındaki saniye sayısı \u003c/br\u003e\n$ PS2: İkincil komut istemi (varsayılan \"\u003e\") \u003c/br\u003e\n\n### Değişkenlere atama\n\nDeğişkeni varname = value ile ayarlayın \u003c/br\u003e\nPS1 = $USER@$HOSTNAME: \u003c/br\u003e\n\u0026nbsp;\u0026nbsp;   Varsayılan kabuk istemini değiştirir \u003c/br\u003e\nPS1 = \"bash_prompt\u003e\" \u003c/br\u003e \nPATH = $PATH:$HOME/bin , $HOME/bin yolu PATH değişkenine atandı\u003c/br\u003e \nPATH = $PATH:~:.  ,  ~ :. PATH'a atandı \u003c/br\u003e\nDATE=\\`date\\` veya DATE=$(date)  , DATE değişkeni oluşturduk ve bu değişkene sistem saatini atadık.\u003c/br\u003e\n\n\n### Metin Tamamlama\n\n\\\u003ctab\u003e geçerli komutu veya dosya adını tamamlama girişiminde bulunur. \u003c/br\u003e\npus\\\u003ctab\u003e genişler(tamamlar) için pushd\\\u003cspace\u003e \u003c/br\u003e\npu\\\u003ctab\u003e alternatifleri verir. yani pu ile başlayan alternatif komutları gösterir bazen 2 kez \\\u003ctab\u003e yapmak gerebiliyor.\u003c/br\u003e\n   pu pup pushd \u003c/br\u003e\n/etc içinde, ls init \u003ctab\u003e girildiğinde aşağıdakileri verir \u003c/br\u003e\ninit init.d. initpipe inittab \u003c/br\u003e\n[lecture]$ ls init \u003c/br\u003e\n\n### Aliases (Takma adlar)\n\nTakma adlar, sık kullanılan komutlar için kısa yol olarak kullanılır. \u003c/br\u003e\nSözdizimi: alias kısayol=komut \u003c/br\u003e\nÖrnekler: \u003c/br\u003e\nalian asd=ls  (artık ls komutuna asd adında bir kısayol atadım terminale asd yazdığım zaman ls komutunu çalıştıracak. \u003c/br\u003e\nalias pu=pushd \u003c/br\u003e\nalias po=popd \u003c/br\u003e\nalias l= \" ls –F -C \" \u003c/br\u003e \nalias ll= \" ls –L –l -F \" \u003c/br\u003e\nalias d=dirs \u003c/br\u003e\nalias hide= \" chmod og-rwx \" \u003c/br\u003e\nalias unhide= \" chmod og+r \" \u003c/br\u003e\n\n### Komuta Tarihi(geçmişi)\n\n- history komutu\u003c/br\u003e\n\nhistory,önceden girilmiş komutları listelemek için kullanılır.\u003c/br\u003e\nm'den n'ye kadar önceden yazılmış komutları listelemek için (fc -l \\\u003cm\u003e \\\u003cn\u003e) 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\u003c/br\u003e\nGeçmiş listesinde gezinmek için imleç tuşlarını yukarı ve aşağı kullanılabilir.\u003c/br\u003e\n\n### Komut Satırında Düzenleme\n\nbash bir dizi satır düzenleme komutu sağlar.\u003c/br\u003e\nVarsayılan emacs modu komutları.(Terminalde komut yazarken uygulanabilecek kısa yollar.) \u003c/br\u003e\n   Esc-b Bir kelime geri git \u003c/br\u003e\n   Esc-f Bir kelime ileri git  \u003c/br\u003e\n   Ctrl-a Satırın başına gitme \u003c/br\u003e\n   Ctrl-e Satırın sonuna gitme \u003c/br\u003e\n   Ctrl-k İmleçten satır sonuna kadar olan metini siler.  \u003c/br\u003e\nDiğer taraftan, ksh kullanıyorsanız komut satırını etkileşimli olarak birkaç şekilde düzenleyebilirsiniz. \u003c/br\u003e\n   set -o vi, komut satırını düzenlemek için vi komutlarını kullanmanızı sağlar. \u003c/br\u003e\n   set -o vi-tabcomplete ayrıca bir TAB girerek komutları/dosya adlarını tamamlamanıza izin verir. \u003c/br\u003e\n   \n   \n### Login(giriş) Script'leri\n\nHer oturum açtığınızda takma adlar, ortam değişkenleri, komut satırı düzenlemeleri vb. Girmek istemezsiniz. \u003c/br\u003e\nBütün bunlar, kabuk her başlatıldığında çalıştırılan bir betikte(script) yapılabilir. \u003c/br\u003e\n\nBaşlangıçta çalıştırılan başlangıç komut dosyaları; \u003c/br\u003e\n\u0026nbsp;  /etc/profile \u003c/br\u003e\n\u0026nbsp;  ~/.bash_profile  \u003c/br\u003e\n \u0026nbsp;\u0026nbsp; \u0026nbsp;\u0026nbsp;    ~/.bash_login (eğer .bash_progile yoksa) \u003c/br\u003e\n\u0026nbsp; \u0026nbsp;\u0026nbsp; \u0026nbsp;    ~/.profile (eğer ikiside yoksa) \u003c/br\u003e\n\nGiriş yaptıktan sonra komut dosyası çalıştırıldı \u003c/br\u003e\n\u0026nbsp;\u0026nbsp;   ~/.bashrc \u003c/br\u003e\nOturum kapatıldıktan sonra komut dosyası çalıştırıldı \u003c/br\u003e\n\u0026nbsp;\u0026nbsp;  ~/.bash_logout \u003c/br\u003e\n   \n   \nörnek .bash_ profile (partial);\u003c/br\u003e\n\n\\# .bash_ profile: oturum açma kabukları için bash tarafından yürütülür. \u003c/br\u003e\numask 022 (0666 \u0026 ~022 = 0644 = rw-r--r--) \u003c/br\u003e\n\\# varsa, .bashrc komutunu ekleyin \u003c/br\u003e\nif [ -f ~/.bashrc ]; then \u003c/br\u003e\n\u0026nbsp;\u0026nbsp; \u0026nbsp;\u0026nbsp;. \\~/.bashrc \u003c/br\u003e\nfi \u003c/br\u003e\n\\# değişkenleri ayarla \u003c/br\u003e \nexport CVSROOT=\\~/.cvsroot \u003c/br\u003e\nexport EDITOR=/bin/vi \u003c/br\u003e\nexport PAGER=/usr/bin/less \u003c/br\u003e\n\n\nörnek .bashrc (partial)\u003c/br\u003e\n\n\\# .bashrc\n\\# bazı genel komutların kısaltmaları\nalias bye=logout\nalias h=history\nalias l='ls –F -C'\nalias ll='ls-L –l -F'\nalias po=popd\nalias pu=pushd\n\nCsh için, giriş kabukları çalıştırılır: \u003c/br\u003e \n  ~/.profile \u003c/br\u003e\nENV ayarlanmışsa: \u003c/br\u003e\n  \u0026nbsp; Bu dosya her yeni terminal için yürütülür \u003c/br\u003e\n  \u0026nbsp; örnek: \u003c/br\u003e\n    \u0026nbsp;\u0026nbsp;ENV=$HOME/.cshrc \u003c/br\u003e\n   \u0026nbsp;\u0026nbsp;EXPORT ENV (for bash) \u003c/br\u003e\n\n\n## Bölüm-7 Temel Kabuk Betiği (basic shell script)\n\nBir kabuk betiği nedir?\n\n.......\n\n### Komut dosyası yürütme (Script Execution)\n\nkomut dosyasını bir argüman gibi kabuk komutuna verin;\u003c/br\u003e\nbash my_script\u003c/br\u003e\n\nveya komut dosyasının ilk satırında kabuğu(shell) belirleyin; \u003c/br\u003e\n\\#!/bin/bash \u003c/br\u003e\n\u0026nbsp;\u0026nbsp; komut dosyasının çalıştırılabilir olduğundan emin olun. \u003c/br\u003e\n\u0026nbsp;\u0026nbsp; my_script 'i doğrudan komut satırında çalıştırın.\n\nDerlemek yoktur, kabuk tarafından yorumlanır.\u003c/br\u003e\n\nBasit bir script;\u003c/br\u003e\n\\#!/bin/bash\u003c/br\u003e\necho \"Hello, World!\"\u003c/br\u003e\npath=$(pwd)\u003c/br\u003e\necho $path\u003c/br\u003e\n\nResult:\u003c/br\u003e\nHello, World!\u003c/br\u003e\n/home/user2\u003c/br\u003e\n\n\n## Kabuk Değişkenleri\n- Numeric (Sayısal)\u003c/br\u003e\n- String(Dize)\u003c/br\u003e\n- Arrays (Diziler)\u003c/br\u003e\n- Komut satırı argümanları; yalnızca okur\n- Fonksiyonlar\n- var değişkenin adını belirtir, $ var değere\u003c/br\u003e\n  var = 100 \u0026nbsp;\u0026nbsp;  \\# değeri 100 olarak ayarlar \u003c/br\u003e\necho ”\\\\$ var = $ var”  \u0026nbsp;\u0026nbsp; \\# $ var = 100 yazdıracak\n- unset var ile, bir değişkeni kaldırabiliriz.\n- İsimler bir harfle başlar ve harf, rakam ve alt çizgi içerebilir.\n\n\n##Sayısal Değişkenler\n\nTamsayı değişkenleri bash'te kullanılabilecek tek saf sayısal değişkenlerdir.\u003c/br\u003e\nbeyan(declaration) ve set değeri:\u003c/br\u003e\n- declare -i var = 100\u003c/br\u003e\n\nSayısal ifadeler çift parantez içine alınır (C stilinde).\u003c/br\u003e Genel format:\n\nvar = $((ifade)) veya var = $[ifade] \u003c/br\u003e\nÖrneğin. i = $((var ++)) veya ((var + = 1))\u003c/br\u003e\nÖrneğin. i = $((var2 = 1 + $ var)) veya ((var2 = 1 + var))\u003c/br\u003e\nÖrneğin. i = $[var + 2] - [var + = 2] Hata!\u003c/br\u003e\nÖrneğin. echo $((var * 7)) veya echo $[var * 7]\u003c/br\u003e\nÖrneğin. echo ((var2 = 1 + var)) veya echo [var2 = 1 + var]\u003c/br\u003e\n\n\nOperatörler C / C ++ ile aynıdır.\u003c/br\u003e\n! +, -, *, /,%, \u0026, |, \u003c,\u003e, \u003c=,\u003e =, ==, =, \u0026\u0026, ||,\n\\+ =, -! =, * =, / =,% = ~, ~ =, \u003c\u003c, \u003e\u003e, ^\n\n\n### Dize(string) Değişkenleri \nAçıkça başka bir tür olarak bildirilmediği sürece, değişkenler string'dir.\u003c/br\u003e\nvar = 100, var'ı \"100\" string'i yapar.\u003c/br\u003e\nBununla birlikte, değişkeni çift parantez içine koymak bir tamsayı olarak kabul edilir. ((var2 = 1 + $ var))\n\n\nAlt stringlerin kullanılması;\u003c/br\u003e\n- ${string:n}  \\# n: index \u003c/br\u003e\n \u0026nbsp;\u0026nbsp;\u0026nbsp;${string:5}  \\# ilk 5 karakter haric\u003c/br\u003e\n \u0026nbsp;\u0026nbsp;\u0026nbsp;${string:(-2)}  \\# son iki karakter\u003c/br\u003e\n- ${string:n:m}  \\# n: index, m: number\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp; ${string:0:5}  \\# ilk 5 karakter\u003c/br\u003e\n \u0026nbsp;\u0026nbsp;\u0026nbsp; ${string:1:3}  \\# 2.ile 4. arasındaki 3 karakter\u003c/br\u003e\n- ${#string}  \\# length of string\u003c/br\u003e\n\nBirleştirilen strings;\u003c/br\u003e\n- var1=\"$var1 $var2\"\u003c/br\u003e\n\n Manipüle string\u003c/br\u003e\n - y=${x:${#x}-1}${x:1:${#x}-2}${x:0:1}\u003c/br\u003e\n bu örnekte x string'inin ilk ve son karakterleri değiştirilerek y'ye atanır.\n\n\nDeğişkenin Yerine koyma;\u003c/br\u003e\n- $name veya ${name} # name değerini kullanır \u003c/br\u003e\n- ${name:-value} # eğer name ayarlanmadıysa, değeri(value) kullan\n- ${name:=value} # name ayarlanmadıysa, değeri kullanın ve name'e degeri ata\n- ${name:?value} # name ayarlanmadıysa, değeri stderr'e yazın\n- ${name:+value} # eğer name ayarlanmışsa, değeri kullanın; aksi takdirde null kullanın\n- ${name%pattern} # en küçük sonek kalıbını kaldır\n- ${name%%pattern} # en büyük sonek kalıbını kaldır\n- ${name#pattern} # en küçük önek kalıbını kaldır\n- ${name##pattern} # en büyük önek kalıbını kaldır\n\nDosya adı değiştirme karakterleri (*,?, [...],!) modelde kullanılabilir.\n\n\n### Dizi Değişkenleri\n\n- Dizi bir değerler listesidir. Boyut bildirmek zorunda değilsiniz\n- Bir değere $ {name [index]} ile referans verilebilir.\n - ${a[3]}\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; #dördüncü konumdaki değer\n- $a  \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;#${a[0]} ile aynıdır\n\nBir dizi bildirmek için declare –a komutu kullanılabilir.\n- declare -a sports \n- sports=(basketball football soccer)\n- spor [3] = hokey\n\n- dizi oluşturma \u003c/br\u003e \nsports=(football basketball) \u003c/br\u003e\nmoresports=($sports tennis) \u003c/br\u003e\n- ${array[@]} or ${array[*]} dizinin tüm içeriğini belirtir.\u003c/br\u003e\necho ${moresports[*]} \u003c/br\u003e\nÇıkış: football tennis \u003c/br\u003e\n- ${#array[*]} dizideki değerlerin sayısını döndürür.\necho ${#moresports[*]}\nOutput: 2\n\n### Dışa aktarılan değişkenler \n\nExport komutu , kabuğun alt(child) süreçlerin değişkene erişmesine izin verir.\u003c/br\u003e\n- export \\\u003cvariables\u003e\n- declara -x \\\u003cvars\u003e\n\nexport –p değişkenlerin ve kabuğunuz tarafından verilen değerlerin bir listesini gösterir.\n\nvartest bir program\u003c/br\u003e\n$\u003e cat vartest\u003c/br\u003e\necho x = $x\u003c/br\u003e\necho y = $y\u003c/br\u003e\n$\u003e x=100\u003c/br\u003e\n$\u003e y=10\u003c/br\u003e\n$\u003e vartest\u003c/br\u003e\nx =\u003c/br\u003e\ny =\u003c/br\u003e\n$\u003e export y\u003c/br\u003e\n$\u003e vartest\u003c/br\u003e\nx =\u003c/br\u003e\ny = 10\u003c/br\u003e\n\n\nParantez içinde bir veya daha fazla komut alt kabukta yürütülür\u003c/br\u003e\n- $\u003e (cd kutusu; ls;)\u003c/br\u003e\nCwd'yi değiştirmeyen bin dizinindeki dosyaları listele\u003c/br\u003e\n- $\u003e (prog1; prog2; prog3) 2\u003e error.txt \u0026\u003c/br\u003e\nArka planda üç program yürütür.\u003c/br\nerror.txt dosyasına üç programdaki hataları yazar\n- $\u003e x=50; (x=100); echo $x 50 çıktılar\n\nKıvrımlı ayraçlar içindeki bir veya daha fazla komut geçerli kabuk tarafından yürütülür\n- $\u003e {cd bin; ls; }\nCwd'yi değiştiren bin dizinindeli dosyaları listeler\n- $\u003e x=50; {x =100; }; echo $x çıktı 100\nGiriş ve çıkış bu yapılardan piped yapılabilir. ve G / Ç yönlendirilebilir.\n\n### Komut Satırı Argümanları\n\nEğer argümanlar bir betiğe(script) geçirilirse, $1,$2,$3, vb. Değerlere sahiptirler. \u003c/br\u003e\n- $0, betiğin(script) adıdır. \u003c/br\u003e\n- $*, $0 hariç, boşluklarla ayrılmış tüm argümanların bir dizesidir.\n- $@, $0 hariç argümanların bir dizisidir.\n- $#, argümanların sayısıdır.\n\n### Çıktı ve alıntılama(quoting)\n\n- echo message  , \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;stdout'a yazdırır.\n- echo –n \"yes/no? \" , \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;bir bilgi istemi\nÇıktıdan sonra yeni satır(newline) yazdırmıyor.\n\nShell, $ ve ‘ ‘(çift tırnak) işaretleri içindeki ifadeleri yorumlar\n- $ —değşken yerine geçer\n- ‘ —komut yerine geçer\necho \"\\`date +%D`\"   \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; # 04/30/05\n\nShell özel karakterleri tek tırnak işaretleri içinde yorumlamaz.\n- echo '\\`date +%D\\`' \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; # \\`date +%D`\n\n- \\\\ \u0026nbsp;,\u0026nbsp;\u0026nbsp; karakterlerden kaçmak için kullanılır (örneğin, \\ ”, \\ $)\n\n### Dönüş değerleri(Return values)\nKomut dosyaları bir tamsayı değeri döndürebilir\u003c/br\u003e\nreturn N kullanılır.\u003c/br\u003e\n$? Değişkeni Son çalıştırılan komutun dönüş değerini içerir. \u003c/br\u003e\nKoşulları test etmek için kullanılabilir \u003c/br\u003e\n$\u003e pwd\u003c/br\u003e\n/home/user\u003c/br\u003e\n$\u003e echo $?\u003c/br\u003e\n0\u003c/br\u003e\n$\u003e pwdd\u003c/br\u003e\npwdd: not found\u003c/br\u003e\n$\u003e echo $?\u003c/br\u003e\n127\u003c/br\u003e\n\n### Kullanıcı tanımlı değişkenler\n\nÖrnekler:\u003c/br\u003e\n- $\u003e name =Ali , name değişkenine Ali değeri atanır\u003c/br\u003e\n- $\u003e echo $ name , Ali görüntülenecek\u003c/br\u003e\n- $\u003e echo Hello $name! , Welcome to $HOME\n ,bunun bilgisayarınızda çıktısını görün.\n\nDeğişken isimleri:\u003c/br\u003e\n__FRUIT, TRUST_NO_1, _2_TIMES (geçerli) \u003c/br\u003e\n2_TIMES, _2*2, NO-1  Invalid (geçersiz) \u003c/br\u003e\n\n\nFRUIT=peach\u003c/br\u003e\nFRUIT=2apples\u003c/br\u003e\nFRUIT=apple+pear+kiwi\u003c/br\u003e\n\nBoşluk kullanımına dikkat edin.\u003c/br\u003e\n$\u003e FRUIT=apple orange plum\u003c/br\u003e\nbash: orange: command not found.\u003c/br\u003e\nTırnak kullanın. \u003c/br\u003e\n$\u003e FRUIT=\"apple orange plum\"\u003c/br\u003e\n\n\n### Kullanıcı Girişi Okuma\n\nGenel biçim:\n - read \u003cdeğişken\u003e\n\nOkuma yürütüldüğünde, kabuk;\u003c/br\u003e\nstandart girdiden bir satır okur.\u003c/br\u003e\nilk sözcüğü \u003cdeğişken\u003e 'de listelenen ilk değişkene atar .\u003c/br\u003e\nikinci sözcüğü ikinci değişkene atar. buna benzer şekilde okuma ve atama yapar.\u003c/br\u003e\n\nSatırda listelenen değişkenlerden daha fazla kelime varsa, fazla sözcük son değişkene atanır.\n\n- read x y \u003c/br\u003e\n\ngirilen ilk satırı okur, ilk sözcüğü x değişkeninde saklar ve satırın kalanını y değişkeninde saklar.\nÖrnek\n\n- $\u003e cat read.sh \u003c/br\u003e\n echo \u0026nbsp;\u0026nbsp;–n \"Lütfen adınızı ve soyadınızı girin:\" \u003c/br\u003e\n read name1 name2\u003c/br\u003e\n         echo \"KTU bilg. müh bölümüne hoşgeldiniz, $name1 $name2\"\n\n\n\n### Komut ve Aritmetik yerdeğiştirme\n\nKomuttan stdout ile değiştirme; \u003c/br\u003e\nvar=\\`komut` (' ' arasında geri alıntı yapar)\u003c/br\u003e\nvar=$(komut)\u003c/br\u003e\n\nİfade değeri ile değiştirme;\u003c/br\u003e\n\nvar = $((expresssion)) \u003c/br\u003e\n\nÖrnekler: \u003c/br\u003e\n$\u003e echo ‘date‘ # date komutunun çıktısını görüntüler\u003c/br\u003e\n$\u003e echo sistemde çalışan  \\`who | wc –l` kişi var\n\u0026nbsp;\u0026nbsp;\n \\# bunun çıktısını görün\u003c/br\u003e\nc = $ ((2 + 3 * 4)) # \"echo $ c\" 14 görüntüleniyor\n\n\n### Tamsayılı(integer) Aritmetik\n\nBash, aritmetik ifadeleri, aritmetik yerdeğiştirme olmadan değerlendirmeyi destekler.\u003c/br\u003e\nSözdizimi dolar işareti olmadan $((...))'a benzer.\u003c/br\u003e\n$\u003e x=10\u003c/br\u003e\n$\u003e ((x=x*12))\u003c/br\u003e\n$\u003e echo $x # 120 verir. \u003c/br\u003e\nAritmetik ifadeler, if, while ve until komutlarında kullanılabilir.\u003c/br\u003e\n\nKarşılaştırma operatörleri çıkış durumunu ayarlar(set'ler)\u003c/br\u003e\nKarşılaştırma sonucu yanlış ise sıfır olmayan bir değer \u003c/br\u003e\nsonuç doğruysa sıfır değeri\u003c/br\u003e\n((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.\u003c/br\u003e\nif((i == 100)) ... [“$i” –eq 100] ile aynı etkiye sahip\u003c/br\u003e\n\n### expr(ifade) komutu\n\nexpr komutu, kullanıcı tanımlı değişkenler üzerinde hesaplamalar yapmak için başka formlar sağlar\u003c/br\u003e\n\nexpr val1 op val2 (boşluklarla ayrılmış)\u003c/br\u003e\nexpr $val1 op $val2 \u003c/br\u003e\nval3 = \\`expr $val1 op $val2`\n\nÖrnekler; \u003c/br\u003e\n$\u003eexpr 5 + 7 \u0026nbsp;\u0026nbsp; #12 döndürür \u003c/br\u003e\n$\u003eexpr 6 – 3 – 2 # gives 1 \u003c/br\u003e\n$\u003eexpr 3 + 4 \\\\* 5 # gives 23\u003c/br\u003e\n$\u003eexpr 24 / 3 # gives 8\u003c/br\u003e\n$\u003esum= \\`expr 5 + 6\\`\u003c/br\u003e\n$\u003eecho $sum  # gives 11\u003c/br\u003e\n$\u003ea=12\u003c/br\u003e\n$\u003eb=90\u003c/br\u003e\n$\u003eecho sum is $a + $b \u0026nbsp;\u0026nbsp; # sum is 12 + 90\u003c/br\u003e\n$\u003eecho sum is \\`expr $a + $b\\`\u0026nbsp;\u0026nbsp; # sum is 102\u003c/br\u003e\n\n### Önceden Tanımlanmış Değişkenler\n\nKabuk tarafından dahili olarak ayarlanan ve kullanıcıya sunulan bazı değişkenler vardır:\u003c/br\u003e\n1$ - $9: Konumsal parametreler \u003c/br\u003e\n$0: Komut adı\u003c/br\u003e\n$#: Konumsal argümanların sayısı\u003c/br\u003e\n$? : Yürütülen son komutun çıkış durumu ondalık dizgesi (0,1,2 ..) olarak verir.\u003c/br\u003e\n$$: Eşsiz(unique) dosya isimleri oluşturmak için yararlı olabilen, çalışılan kabuğun süreç(process) numarası. \u003c/br\u003e\n$! : Arka planda çalışan son komutun işlem kimliği (Son arka plan işleminin PID'sini tutar). \u003c/br\u003e\n$- : Kabuğun bu çağrısına uygulanan tedarik edilmiş mevcut seçenekler.\u003c/br\u003e\n$* : $1 'dan başlayan, kabuğun tüm argümanlarını içeren bir dize.\u003c/br\u003e\n$@: Alıntılananlar hariç, yukarıdakiyle aynı.\u003c/br\u003e\n\nNot: $* ve$ @ alıntı yapıldığında aynıdır ve değişkenlere genişler.\u003c/br\u003e\n\"$*\", 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. \u003c/br\u003e\n\"$@\", 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.\n\n\n### Argümanları komut dosyalarına geçirme\n\nStandart UNIX komutları gibi, kabuk komut dosyaları(shell scripts)'da komut satırından değişken alabilir.\u003c/br\u003e\nBağı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.\u003c/br\u003e\n$0  konum parametresi, komut adını veya kabuk komut dosyasını içeren yürütülebilir dosyanın adını belirtir.\u003c/br\u003e\nTüm konumsal parametreler $* özel parametresi kullanılarak ifade edilebilir.\u003c/br\u003e\n\n\nExamples\n\n$ cat pass_arg. \u0026nbsp;\u0026nbsp;\n \\# 5 sayı kabul eden ve toplamını gösteren bir script.\u003c/br\u003e\naktarılan parametrelerin gösterimleri(echo ile) : $1, $2, $3, $4, $5\u003c/br\u003e\nbetiğin adının gösterimi (echo ile) : $0\u003c/br\u003e\naktarılan parametrelerin sayısı(echo ile) : $#\u003c/br\u003e\nsum=\\`expr $1 + $2 + $3 + $4 + $5\\`\u003c/br\u003e\ntoplamları : $sum\u003c/br\u003e\n\n\n### shift komutu\n\nBir komut dosyasına 9'dan fazla parametre iletilirse, parametrelere erişmek için iki alternatif vardır:\u003c/br\u003e\n\nNotasyonu ${n}\u003c/br\u003e\nshift komutu\u003c/br\u003e\n\nShift komutu parametreleri bir konum sola kaydırır.\u003c/br\u003e 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.\n\nÖrnek;\u003c/br\u003e\n\nFarklı sayıları kabul edecek ve toplamlarını bulacak bir komut dosyası yazalım. Parametrelerin sayısı değişebilir.\u003c/br\u003e\n\n$ cat sum_arg\u003c/br\u003e\nsum=0\u003c/br\u003e\nwhile [ $# -gt 0 ]\u003c/br\u003e\ndo\u003c/br\u003e\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;    sum=\\`expr $sum + $1\\`\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;     shift\u003c/br\u003e\ndone\u003c/br\u003e\necho sum is $sum\u003c/br\u003e\n\nÖ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.\u003c/br\u003e\n\n\\#!/bin/bash\u003c/br\u003e\necho \"arg1=$1 arg2=$2 arg3=$3\"\u003c/br\u003e\nshift\u003c/br\u003e\necho \"arg1=$1 arg2=$2 arg3=$3\"\u003c/br\u003e\nshift\u003c/br\u003e\necho \"arg1=$1 arg2=$2 arg3=$3\"\u003c/br\u003e\nshift\u003c/br\u003e\necho \"arg1=$1 arg2=$2 arg3=$3\"\u003c/br\u003e\n\n\n### Null komutu\n\nKabuk yerleşik bir null komutuna sahiptir\n\nformatı basit;\n- :\n\nAmaç hiçbir şey yapmamak\n\nGenellikle bir komutun, özellikle de komutlarda görünmesi gerekliliğini yerine getirmek için kullanılır. \u003c/br\u003e\n\nif grep “^$system” ~/mail/systems \u003e /dev/null\u003c/br\u003e\nthen\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;:\u003c/br\u003e\nelse\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;echo “$system is not a valid system”\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;exit 1\u003c/br\u003e\nfi\u003c/br\u003e\nKabuk, bundan sonra bir komut yazmanızı gerektirir.\nSistem geçerliyse, hiçbir şey yapılmaz\n\n\n\n### \u0026\u0026 ve || operatörleri\n\nKabuk, 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.\n\n\u0026\u0026 operatörü eğer önceki komut başarılı bir şekilde derlenirse sonraki komutu uygular.\n- komut1 \u0026\u0026 komut2\n\nkomut2 yalnızca komut1 sıfır çıkış durumunu döndürürse çalıştırılır.\u003c/br\u003e\nörnek; \u003c/br\u003e\n[ -z $EDITOR ] \u0026\u0026 EDITOR=/bin/ed\n\n|| operatörü eğer önceki komut başarısız bir şekilde derlenirse sonraki komutu uygular.\n- komut1 || komut2\n\nkomut2 yalnızca komut1 sıfır olmayan bir çıkış durumu döndürdüğünde çalıştırılır\n\nÖrnekler; \u003c/br\u003e\n[ -z $PATH ] || echo $PATH \u003c/br\u003e\n grep \"$name\" phonebook || echo \\ \u003c/br\u003e\n“Not found $name“ \u003c/br\u003e\n who | grep \"^$name \" \u003e /dev/null || echo \\ \u003c/br\u003e\n\"$name's not logged on“ \u003c/br\u003e \n\n(Satırın sonunda \\ kullanıldığında, kabuğun satıra devam ettiğini bildirir.)\n\n\u0026\u0026 ve || Aynı komut satırında da birleştirilebilir:\n\nwho | grep \"^$name \" \u003e /dev/null \u0026\u0026 \\\\\u003c/br\u003e\necho \"$name is logged on\" || echo \"$name’s \\\\\u003c/br\u003e\nnot logged on\"\n\nGrep başarılı olursa ilk echo gerçekleşir;başarısız olursa ikinci echo.\n\nBu operatörler if komutları ile temsil edilebilir.\n\nif grep \"$name\" phonebook\u003c/br\u003e\nthen\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;:\u003c/br\u003e\nelse\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;echo \"Couldn't find $name“\u003c/br\u003e\nfi\u003c/br\u003e\n\n\n### Koşullu İfadeler\n\nHer 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.\n\n0 (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.\n\nTamsayı kullanıyorsanız: ((koşul))\u003c/br\u003e\nDizeler kullanılıyorsa: [[koşul]]\u003c/br\u003e\nÇıkış durumları duruma bağlı olarak sıfır veya sıfır değildir \u003c/br\u003e\nÖrnekler:\u003c/br\u003e\n(( a == 10 ))\u003c/br\u003e\n(( b \u003e= 3 ))\u003c/br\u003e\n[[ $1 = -n ]]\u003c/br\u003e\n[[ ($v != fun) \u0026\u0026 ( $v != games) ]]\u003c/br\u003e\n(( Z \u003e 23 )) \u0026\u0026 echo Yes\u003c/br\u003e\n\nDosya varlığı, dosya izinleri, sahiplik, dosya türü vb. İçin özel koşullar.\n\n- [[ -e $file ]] –File exists?  (dosya mevcut mu?)\n- [[ -f $file ]] –Regular file? (dosya normal mi?)\n- [[ -d $file ]] –Directory? (dizin mi?)\n- [[ -L $file ]] –Symbolic link? (sembolik link?)\n- [[ -r $file ]] –File has read permission? (dosya okuma izni varmı)\n- [[ -w $file ]] –File has write permission? (dosya okuma yazma varmı)\n- [[ -x $file ]] –File has execute permission? (dosya çalıştırma izni varmı)\n- [[ -p $file]] –File is a pipe?\n\n \n ### İf deyimi\n\nİf ifadesi verilen komutun çıkış durumunu kullanır ve şartlı olarak aşağıdaki ifadeleri çalıştırır.\n\nGenel sözdizimi:\u003c/br\u003e\nif koşul\u003c/br\u003e\nthen\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;komutlar (koşul doğruysa)\u003c/br\u003e\nelse\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;komutlar (koşul yanlışsa)\u003c/br\u003e\nfi\u003c/br\u003e\n\nİç içe if ifadesi:\u003c/br\u003e\nif (-----)\u003c/br\u003e\nthen ...\u003c/br\u003e\nelse if ...\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;...\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;fi\u003c/br\u003e\nfi\u003c/br\u003e\n\nelif ifadesi, else if ifadesi için kısa yol olarak kullanılabilir.\n\nörnek: \u003c/br\u003e\nif [[ -r $fname ]]\u003c/br\u003e\nthen\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;echo “$fname is readable”\u003c/br\u003e\nelif [[ -w $fname \u0026\u0026 -x $fname ]]\u003c/br\u003e\nthen\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;echo “$fname is writeable and\nexecutable”\u003c/br\u003e\nfi\n\n### test komutu\n\nUnix 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.\n\nTest komutu herhangi bir çıktı üretmez, ancak testin başarısız olup olmadığını kontrol etmek için çıkış durumu if ifadesine geçirilebiliriz.\n\nHerhangi bir komutun çıkış durumunu nasıl öğrenebilirim?\n\nTü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;\u003c/br\u003e\necho$?\u003c/br\u003e\nBunun çı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.\n\nTest komutunun aşağıda açıklanan dosyalar, sayısal değerler ve diziler üzerinde çalışması için belirli operatörleri vardır:\nTest komutuyla kullanılan Sayısal \n\nDeğişkenlerdeki İşleçler:\n- -eq : equal to(eşittir)\n- -ne : not equals to(eşit değildir)\n- -gt : grater than (dan büyüktür)\n- -lt : less than (dan küçüktür)\n- -ge : greater than or equal to(büyük veya eşittir)\n- -le : less than or equal to(küçük veya eşittir.)\n\n\nTest komutuyla kullanılan String Değişkenleri işleçleri:\n- =  : equality of strings(dizgelerin eşitliği)\n- !=  : not equal (eşit değil)\n- -z : zero length string (sıfır karakter içeren dize yani null dize).\n- -n : String length is non zero.(dize uzunluğu sıfır değil)\n\nÖrnekler: \u003c/br\u003e\n$\u003e a=12; b=23 \u003c/br\u003e\n$\u003e test $a –eq $b \u003c/br\u003e\n$\u003e echo $? \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; # 1verir \u003c/br\u003e \n$\u003e name=”Ahmet” \u003c/br\u003e\n$\u003e test –z $name \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; #return 1 \u003c/br\u003e \n$\u003e test –n $name \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; #return 0\u003c/br\u003e\n$\u003e test –z “$address” \u003c/br\u003e\n$\u003e test $name = “Ali” \u003c/br\u003e\n\nTest komutuyla kullanılan dosyalardaki operatörler:\u003c/br\u003e\n- -f: dosya var.\n- -s: dosya var ve dosya boyutu sıfır değil.\n- -d: dizin var.\n- -r: dosya var ve okuma iznine sahip.\n- -w: dosya mevcut ve yazma iznine sahip.\n- -x: dosya var ve yürütme iznine sahip.\n\nÖrnekler: \u003c/br\u003e\n$\u003e test –f “mydoc.doc”\u003c/br\u003e\n\\# mydoc.doc dosyasını kontrol eder, varsa 0, yoksa 1 döndürür.\u003c/br\u003e\n$\u003e test –r “mydoc.doc”\u003c/br\u003e\n\\# mydoc.doc için okuma izni olup olmadığını denetler\u003c/br\u003e\n$\u003e test –d “$HOME”\u003c/br\u003e\n\\# kullanıcıların ana dizininin varlığını kontrol eder..\u003c/br\u003e\n\n\n### Test komutuyla kullanılan Mantıksal Operatörler:\nBirden fazla koşulu birleştirmek mantıksal AND, OR ve NOT işleçleriyle yapılır.\n- -a: mantıksal AND(VE)\n- -o: mantıksal OR(VEYA)\n- ! : mantıksal NOT(DEĞİL)\n\n$\u003e test –r “mydoc.doc” –a –w “mydoc.doc”\u003c/br\u003e\n\\# 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.\n\nif who | grep -s hakan \u003e /dev/null\u003c/br\u003e\nthen\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;echo hakan CE sunucusuna giris yapti \u003c/br\u003e\nelse\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;echo hakan CE sunucusunda mevcut degis\u003c/br\u003e\nfi\n\nBu script, şu anda sisteme giriş yapmış olan kişileri listeler ve çıktıyı grep üzerinden pipe ile yönlendirir.\n\n\n### durum(case) açıklamaları\n\nSözdizimi:\u003c/br\u003e\n  case expression in\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;pattern1)\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;commands ;;\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;pattern2)\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;commands ;;\u003c/br\u003e\n...\n*)\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;commands ;;\u003c/br\u003e\nesac\u003c/br\u003e\n\nörnekler: \u003c/br\u003e\nörnek1:  \ncase $1 in \u003c/br\u003e\n-a)\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;a seçeneğiyle ilgili komutlar ;;\u003c/br\u003e\n-b)\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;b seçeneğiyle ilgili komutlar ;;\u003c/br\u003e\n*)\u003c/br\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;diğer tüm seçenekler ;;\u003c/br\u003e\nesac\u003c/br\u003e\n\nörnek2:  \nclear\u003c/br\u003e\necho \"1. Date and time\"\u003c/br\u003e\necho  \necho \"2. Directory listing\"    \necho  \necho \"3. Users information \"  \necho  \necho \"4. Current Directory\"  \necho  \necho –n \"Enter choice (1,2,3 or 4):\"  \n\nörnek3:  \n\nread choice  \ncase $choice in  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;1\\) date;;  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;2) s -l;;  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;3) who ;;  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;4) pwd ;;  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;*) echo wrong choice;;  \nesac  \n\nbu 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.\n\n### for döngüsü\n\nSözdizimi:  \nfor var [in list ]  \ndo  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; commands  \ndone  \n\nTek bir satırdaki komutlar noktalı virgülle (;) ayrılır.  \nListe belirtilmezse, $@ kabul edilir.  \nAksi takdirde ${list [*]}   , Burada liste bir dizi değişkenidir.\n\nörnekler:  \n\nfor colors in Red Blue Green Yellow Orange Black Gray  \n\u0026nbsp;\u0026nbsp;do  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;echo $colors  \n\u0026nbsp;\u0026nbsp;done  \necho\n\nBu örnek verilen tüm renkleri terminale yazdırır.\n\n### While döngüsü\n\nSözdizimi:  \nwhile command-list1  \ndo  \n\u0026nbsp;\u0026nbsp; command-list2  \ndone  \n\ncommand-list1'deki son komutun çıkış durumu 0 (sıfır) ise, command-list2'deki komutlar yürütülür.  \n\nAnahtar kelimeler break, contiune ve return , C / C ++ ile aynı özelliklere sahiptir.\n\nbreak [num] veya contiune [num] # num döngü sayısıdır  \n\n\n### Until döngüsü\n\nSözdizimi:  \nUntil command-list1  \ndo  \n\u0026nbsp;\u0026nbsp; command-list2  \ndone  \n\nDöngü, command-list1'in çıkış durumu sıfır olmadıkça gerçekleştirilir.\n\nWhile/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.\n\nörnekler:  \n\n### eval komutu \n...\n(Bölüm 7 henüz bitmedi devam edicek :))\n\n\n\n## Bölüm-8 Gelişmiş Kabuk Betiği(Advanced Shell Scripting )\n\n### Fonksiyon oluşturma ve kullanma\n\nBir kabuk fonksiyonunun tanımı aşağıdaki gibidir:  \nisim(){list ;}  \n\nGeçerli ve geçersiz fonksiyon tanımları:\nlsl(){ ls -l ; } \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;# geçerli  \nlsl { ls -l ; } \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;# geçersiz  \n\nsh için takma ad tanımlama:  \n$\u003e cat mycd  \ncd () { chdir ${1:-$HOME} ; PS1=\"\\`pwd\\`$ \" ; export PS1 ; }  \n$\u003e source mycd  \n\n\nÖrnekler:\n\nyazdir(){  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;for i in {1..13}  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\tdo  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\t\techo \"hakan\"  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\t\techo \"$i\"  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\tdone  \n}  \n\nBu 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.  \n\n- source dosya_adı\n\nBu komuttan sonra dosyamızdaki fonksiyonu ismiyle çağırabiliriz(sadece mevcut terminalde):  \nyazdir    \nhakan  \n1  \nhakan  \n2 ...  \n\n\nHer dizinin tek bir satırda listelenmesiyle, PATH'nin geçerli değerini listelemek:  \n\nlspath() {  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;OLDIFS=\"$IFS\"  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;IFS=:  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;for DIR in $PATH ; do echo $DIR ; done  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;IFS=\"$OLDIFS\"  \n}  \n$\u003e lspath | grep \"/usr/dt/bin\"  \n\n\n\u003c/br\u003e\nDizinini uygun hale getirmek: \n\nsetPath() {  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;PATH=${PATH:=\"/sbin:/bin\"};  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;for _DIR in \"$@\"  \ndo  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;if [ -d \"$_DIR\" ] ; then  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;PATH=\"$PATH\":\"$_DIR\" ; fi  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;done  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;export PATH  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;unset _DIR  \n}\n\nÖrnek bir çağrı:  \n$\u003e setPath /sbin /usr/sbin /bin /usr/bin /usr/ccs/bin  \nHer argümanının bir dizin olup olmadığını kontrol eder ve bir dizin varsa PATH'ye eklenir.  \n\n\n### Fonsiyona parametre verme\n\nBir parametre script'e iletildiği gibi bir fonsiyona da iletilebilir.  \nfonksyion tanımlamak için sözdizimi:  \nfonksyion fonksyion_adı()\n{  \ndeyim1  \ndeyim2  \ndeyimN  \n}  \nBu işlev komut satırından veya kabuk betiğinin içinde aşağıdaki şekilde çağrılır:\nfonsiyon-adı arg1 arg2 arg3 argN  \n\nörnek:  \n\n$ vi pass  \nfunction demo()  \n{  \necho \"All Arguments to function demo(): $*\"  \necho \"First argument $1\"  \necho \"Second argument $2\"  \necho \"Third argument $3\"  \nreturn  \n}  \n\\# fonksyionu cağrıyoruz.  \ndemo -f foo bar  \n\nçıktısı:  \nAll Arguments to function demo(): -f foo bar  \nFirst argument -f  \nSecond argument foo  \nThird argument bar  \n\n### Değer döndürme(return)\n\nÖrnek tanım:  \nfunction topla {  \n(( toplam=$1+$2 ))  \nreturn $toplam  \n}  \n\nfonksiyonu çağırmak:  \ntopla 2 3  \necho $?  \n\n$? son işlev çağrısından veya komut tarafından döndürülen değerdir.\n\n\n### Fonksiyonlar arasında veri paylaşımı\n\nC kabuğu(shell),csh, UNIX dosya sisteminde hızlı hareket etmek için üç yardımcı komut sağlar:  \n- popd\n- pushd\n- dirs\n\nBu 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.\n\n\ndirs uygulaması:  \n\u003c/br\u003e\ndirs() {  \n\u0026nbsp;\u0026nbsp;\\# IFS'yi kaydedin, ardından şuna ayarlayın:   \n\u0026nbsp;\u0026nbsp;\\# _DIR_STACK öğelerine ayrı ayrı erişmek için.  \n\u0026nbsp;\u0026nbsp; OLDIFS=\"$IFS\"  \n\u0026nbsp;\u0026nbsp;IFS=:  \n\u0026nbsp;\u0026nbsp;# her dizini ve ardından bir boşluk yazdır  \n\u0026nbsp;\u0026nbsp;for i in $_DIR_STACK  \n\u0026nbsp;\u0026nbsp;do  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;echo \"$i \\c“  \n\u0026nbsp;\u0026nbsp;done  \n\u0026nbsp;\u0026nbsp;# tüm girişlerden sonra yeni bir satır ekle  \n\u0026nbsp;\u0026nbsp; \\# _DIR_STACK yazdırıldı\n\u0026nbsp;\u0026nbsp;echo  \n\u0026nbsp;\u0026nbsp; \\# IFS'yi geri yükle \n\u0026nbsp;\u0026nbsp;IFS=\"$OLDIFS\"  \n}  \n\npushd uygulaması:  \n...(gelecek)  \npopd uygulaması:  \n...(gelecek)  \n\n### echo komutu\n\nmetin veya değişken değerlerini gösterir.  \necho [options] [string, değişkenler ...]\n\nSeçenekler:  \n- -n Sondaki yeni satırı çıkışa vermez.\n- -e Aşağıdaki kaçış karakterleri yorumlar.\n- \\\\c Sondaki yeni satırı bastırır.\n- \\\\a Bir uyarı (zil).\n- \\\\b geri al.\n- \\\\n yeni satır.\n- \\\\r satır başı.\n- \\\\t yatay sekme(tab).\n- \\\\ters eğik çizgi.\n\n### renkli metin gösterme\n\necho ile birlikte kullanılan bazı kontrol karakterleri vardır.  \nBu kod, mesajı Mavi renkte yazdırır:  \n$\u003e echo \"\\033[34m Hello Colorful World!\"  \nHello Colorful World!  \n\nBu ANSI kaçış dizisini kullanır (\\033[34m).  \n\\033, kaçış karakteri, biraz harekete geçiyor  \n[34m kaçış kodu ön plan rengini Mavi olarak ayarlar  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;[ CSI'nin başlangıcıdır (Komut Dizisi Giriş).  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;34, parametredir.  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;m harfdir (eylemi belirtir).  \n\nGenel sözdizimi:  \necho -e \"\\033[ escape-code your-message \"\n\u003c/br\u003e\n(Bu başlık vakit bulursam genişletilebilir...)\n\n### Komut dosyası yürütme(script execution)\n\nKomut dosyasını kabuk programına bir argüman olarak verin (ör. Bash my_script).  \nVeya komut dosyasında hangi kabuğun kullanılacağını belirtin.  \n- script'in ilk satırı #!/bin/ bash\n- Komut dosyasını chmod kullanarak yürütülebilir duruma getirin.\n- PATH'in geçerli dizini içerdiğinden emin olun.\n- Doğrudan komut satırından çalıştırın \n\nDerleme gerekmez!\n\n\n\n## Bölüm-9 Yazılım Geliştirme: g++ ve make\n\n### Yazılım geliştirme süreçi\n\n- Kaynak dosyalarının oluşturulması.(.c, .h, .cpp)\n- Derleme (*.c , *.o) ve bağlama(linking)\n- Programları çalıştırma ve test etme.  \n\n\nGeliştirme araçları:  \nKaynak dosyalarının oluşturulması.(.c, .h, .cpp)  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; Text editörleri; vi ,emacs  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; versiyon kontrol sistemleri; rcs, cvs  \nDerleme (*.o) and bağlama.  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;Derleyiciler; gcc, g++    \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;Otomatik yapı(building) araçları; make  \nÇalıştırma ve test etme(xdb,gdb)  \n\n### Derleme şüreci\n\n![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-9/photo1.png)\n\n### Temel g++ Örnekleri\n\n- g++ hello.cpp  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; hello.cpp derlenir  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; çalıştırılabilir a.out dosyası üretir  \n- g++ -o hello hello.cpp  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; hello.cpp derlenir  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; çalıştırılabilir hello dosyası üretir.  \n- g++ -o hello hello.cpp util.cpp  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; hello.cpp ve util.cpp derlenir  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; çalıştırılabilir hello dosyası üretir.  \n\nAyrı ayrı derleme:  Herhangi bir kaynak dosyadan, daha sonra çalıştırılabilir yapmak için bağlanacak bir nesne dosyası oluşturabilirsiniz.  \n- g++ -c hello.cpp\n- g++ -c util.cpp\n- g++ -o hello hello.o util.o  \n\n\n### g++ seçenekleri\n\n- -c  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;kaynak dosyalarını derler ama bağlantı(link) yapmak  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;çıktı(output) kaynak dosyaya karşılık gelen bir nesne dosyasıdır.  \n- o \\\u003cdosya\\\u003e  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;çıktıyı \\\u003cdosya\\\u003e adlı bir dosyaya koyar.  \n- g  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;çıktıdaki hata ayıklama(debugging) sembollerini dahil et.  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;daha sonra hata ayıklama programı(gdb) tarafından kullanılacak.  \n- Wall  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;Tüm uyarıları göster(program hala derlenebilir).  \n- -D\\\u003cmacro\\\u003e  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;macro '1' string'i ile tanımlanır  \n- -l\\\u003cname\\\u003e  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;lib\\\u003cname\\\u003e.a adlı kütüphaneyi dahil eder.\n- -I\\\u003cpath\\\u003e  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;verilen dizinde bulunan dosyalar dahil etmek(include) için bakar.  \n- L\\\u003cpath\\\u003e  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;verilen dizinden bulanan kütüphanelere bakar.  \n\ng++'nın kütüphaneler ve dahil edilen dosyalar için varsayılan dizinleri vardır.\n\n\n### g++ 'da tanımlar\n\nGenellikle programlar aşağıdakilere dayanan koşullu parçalar içerir:  \n\\#ifdef DEBUG  \nprintf(“value of var is %d”, var);  \n\\#endif  \n\nÖnişlemci tanımlarını komut satırından ayarlayabilirsiniz:  \ng++ -DDEBUG -o prog prog.c  \n\n\n(genişletilecek...)  \n\n### Derlemede'de make kullanımı\n\nÇok sayıda dosya içeren orta ve büyük çaplı yazılım projelerini derlemek şu sebeblerden zor olur:  \n- Her seferinde tüm dosyaları doğru bir şekilde derlemek için komutların yazılması\n- Hangi dosyaların değiştirildiğinin takip edilmesi\n- Dosyalar arasındaki bağlılıkların takip edilmesi  \n\nmake, bu işlemleri otomatikleştirir.  \n\n### make'in temek işlemleri\n\nProgramı oluşturmak için, kurallar içeren [Mm]akefile adlı bir dosyayı okur.  \n- Eğer program başka bir dosyaya bağlıysa, ozaman bu dosya oluşturulur.\n- Tüm bağımlılıklar bağımlılıklar zincirinde geri doğru çalışacak şekilde inşa(build)edilir.\n- Programlar yalnızca bağlı(depend) oldukları dosyalardan daha eski ise inşa(built) edilebilir.\n\n### Temel Makefile Örnekleri\n\n\\# mydb için Makefile  \nmydb: mydb.o user.o database.o  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;g++ -o mydb mydb.o user.o database.o  \nmydb.o : mydb.cpp mydb.h  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;g++ -c mydb.cpp  \nuser.o : user.cpp mydb.h  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;g++ -c user.cpp  \ndatabase.o : database.cpp mydb.h  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;g++ -c database.cpp  \n\n![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-9/photo2.png)\n\n\n### Bir Makefile'ın parçaları\n\nBağımlılık satırları:  \n- Hedef(target) adlarını ve bağımlılıklarını içerir (isteğe bağlı)\n- bağımlılıklar(dependencies)  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;Dosyalar  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;hedefler\nKomutlar:  \n- bağımlılık satırın altında olmalı\n- her zaman bir çıkıntıyla(tab) başla\n- bağımlılığı karşılamak için komutlar\n\n![foto2](https://github.com/hknakst/Sistem-programlama/blob/master/photos/b%C3%B6l%C3%BCm-9/photo3.png)\n\n### Makrolar(macros) ve özel değişkenler\n\nMakefile'daki metni temsil etmek için makrolar kullanılır.  \n- yazarken kaydeder.\n- Makefile'ın kolayca değiştirilmesine izin verir.\n- atamalar(assignment)  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;Kullanımı: ${MACRONAME}  \n\nKomutlarda özel değişkenler kullanılır:\n- $@ hedefi temsil ediyor.\n- $? bağımlılıkları temsil ediyor.  \n\n### örneği basitleştirme\n\nOBJS = mydb.o user.o database.o  \nCC = /usr/bin/g++  \n\nmydb: ${OBJS}  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;${CC} -o $@ $?  \nmydb.o: mydb.cpp mydb.h  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;${CC} -c $?  \nuser.o: user.cpp mydb.h  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;${CC} -c $?  \ndatabase.o: database.cpp mydb.h  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;${CC} -c $?  \n\n\n### Make'i cağırmak (invoking make)\n\n- açıklama dosyası olduğundan emin olun  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;makefile veya Makefile olarak adlandırılır  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;kaynak dosyalarının bulunduğu dizinde  \n- make  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;dosyada ilk hedefi oluşturur\n- make hedef(leri)  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; hedef(leri) oluşturur(builds).\n - diğer seçenekler:  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \\-n: komutları çalıştırma, sadece listele  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \\-f \\\u003cfile\\\u003e: [Mm]akefile yerine \\\u003cfile\\\u003e 'ı kullan.\n\n\n### Diğer Makefile Notları ve Son ek(suffix) kuralları\n\nYorumlar ‘#’ ile başlar  \nBir satırın başına veya yorum olmayan bir satırın sonuna konulabilir.  \nÇok uzun olan satırlar, önceki satırın sonuna line \\\\ koyarak bir sonraki satırda devam edebilir.  \n\n\u003c/br\u003e\nSon Ek Kuralları:  \nher .o dosyasını kaynak dosyadan nasıl oluşturacağını söylemek hala sıkıcı.  \nSonek kuralları bu tür durumları genelleştirmek için kullanılabilir. \n\n- Varsayılan bir sonek kuralı, komut tarafından çalıştırarak kaynak dosyalarını, .o dosyalarına dönüştürür:  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;${CC} ${CFLAGS} -c $\u003c  \n- $\u003c , önkoşul anlamına gelir (file.cpp)\n\n### En Basit Makefile Örneği\n\nOBJS = mydb.cpp user.cpp database.cpp  \nCC = /usr/bin/g++  \n\nmydb: ${OBJS}  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;${CC} -o $@ $?  \n\n### Diğer Faydalı Makefile İpuçları\n\nAra dosyaları(intermediate) kaldırmanın bir yolunu dahil edin.\n- clean:  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;rm –f mydb  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;rm -f * .o  \n\nçoklu programlar oluşturmak için bir hedef dahil edin.\n- all: mydb mycalendar myhomework  \n\n\n## Bölüm-10 Hata ayıklama (Debugging)\n\n(pek yakında...) \n\n## Bölüm-11 Dosya yönetimi (File Management)\n\n(devamı pek yakında...)\n\n### Sistem Çağrıları\n\nProgramlar, kütüphaneler üzerinden sistem çağrıları yapar. \n- libc, sistem çağrıları için C arayüzü sağlar.\n- doğrudan Unix çekirdeğine bir altprogram çağrısı.  \n\n4 ana sistem çağrısı kategorisi:\n- Dosya yönetimi.\n- Süreç yönetimi.\n- İletişim.\n- Hata ve sinyal işleme.\n\n\n### Program yürütmek\n\n- Özel bir başlatma rutini (crt0) her zaman programınıza bağlanır.\n- Bu rutin argümanları okur ve main'i çağırır.\n- 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.\n- Programınız, çıkışta dosya tanımlayıcılarını kapatan ve diğer kaynakları temizleyen özel işlevler de çağırır.\n\n### C'ye karşı C++\n\n- string veri türü yok  \nBunun yerine karakter dizileri kullanın\nKarakter dizilerini “atamak” için strcpy (), strncpy (), strcmp (), strncmp () kullanın.\n- Gömülü beyan yok(embedded declarations)  \nTüm değişkenlerin bir kod bloğunun başlangıcında bildirilmesi gerekir\n- Çok farklı Dosya ve Standart G / Ç fonksiyonları  \nprintf() cout'a karşı  \nscanf() ve fgets() cin'e karşı  \n\n\n### Arabelleksiz(unbeffered) G/Ç vs. Standart G/Ç\n\nArabelleksiz giriş/çıkış:\n- sistem çağrılarını kullanarak g/ç gerçekleştirebilir.(open,read,write,close,lseek)\n- arabellek boyutunu ve bayt'ların numarasını belirtmeniz gerekir.\n- Biçimlendirme seçeneği yok.\n- Bu fonksiyonlar dosya tanımlayıcılarını argüman olarak kullanır.\n- Sabitler unistd.h'da tanımlanır(STDIN_FILENO, gibi).  \n\nStandart giriş/çıkış:  \n- Bir C kütüphanesi fonksiyon dizisi(printf,scanf,getc)\n- Arabellekleme(bufferin) otomatik.\n- Birçok biçimlendirme seçeneği\n- stdio fonksiyonları ilkel sistem çağrılarından oluşur.\n- Sabitler stdio.h'da tanımlanır(stdin, gibi).\n\n### Temel Dosya G/Ç\n\n- Unix'de herşeyin bir dosya olduğunu hatırlayın ve unutmayın.\n- çekirdek(kernel), her süreç için açık dosyaların bir listesini tutar.\n- Dosyalar okuma,yazma için açılabilir.\n- G/Ç sistem çağrılarını kullanmak için \\\u003cstdio.h\\\u003e dahil edilmelidir.(include)  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; 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.\n\n\n- Çoğu Unix G/Ç, 5 sistem çağrısı ile yapılabilir.  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; open, read, write, close, lseek\n- Her dosya bir dosya tanımlayıcısı tarafından referans edilir(bir tam sayı)).\n- Üç dosya otomatik olarak açılır:  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; FD 0: standart giriş  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; FD 1: standart çıkış  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; FD 2: standart hata  \n- Yeni bir dosya açıldığı zaman, en küçük FD'ye atanır.\n- man -s 2 \u003csystemcall\u003e (daha fazla bilgi almak için)\n\n### open()\n\nint open(char *path, int flags, mode_t mode);  \npath: absolute(mutlak) veya relative(göreceli) path  \nflags(bayraklar):  \n- O_RDONLY - okumak için aç\n- O_WRONLY - yazmak için aç\n- O_RDWR - okuma ve yazma için aç\n- O_CREAT - mevcut değilse dosyayı oluştur\n- O_TRUNC - eğer varsa dosyayı keser (üzerine yazar).\n- O_APPEND - sadece dosyanın sonuna yaz\n\nmodu: eğer O_CREAT kullanıyorsanız, izinleri açıkca belirtin  \nYeni atanan dosya tanımlayıcısını döndürür.  \n\n- Oluşturulma izinleri:  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;777 vs 0777 vs 0x777  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; izinler:  \n  - read(r--,4)\n  - write(-w-,2)\n  - execute(--x,1)  \n  \n  kim(who):  \n  \n  - user(0700)\n  - group(0070)\n  - others(0007)\n\n\n- fd = open(”name”, O_RDWR|O_CREAT, 0700);\n- fd dönen değer:  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;fd \u003e= 0 – açma başarılır  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;fd \u003c 0 – açma başarısız  \n\n\n### read() ve write()\n\nssize_t read(int fd, void *buf, size_t nbytes);  \nssize_t write(int fd, void *buf, size_t nbytes);  \n\n- fd, open tarafından döndürülen değerdir.\n- buf genellikle bir veri dizisidir\n- nbayt buf boyutu(okunan) veya yazılacak veri boyutudur\n- döndürülen değer:  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003e 0 okunan veya yazılan bayt sayısıdır.  \n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c= okumak için nbayt  \n\u0026nbsp;\u0026nbsp;\u0026nb","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhknakst%2FSistem-programlama","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhknakst%2FSistem-programlama","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhknakst%2FSistem-programlama/lists"}