← man/shells_and_env
bash — man bash — 80×24
ugur@toprak:~/man/shells_and_env$man bash
Bölüm 1 Kabuklar & Ortam

bash

GNU Bourne-Again SHell (Yeniden Doğan Kabuk)

Özet

       bash [seçenekler] [dosya]

Telif Hakkı

Bash Telif Hakkı (C) 1989-2005 Free Software Foundation, Inc. firmasına aittir.

Açıklama

Bash, standart girdiden veya bir dosyadan okunan komutları yürüten, sh ile uyumlu bir komut dili yorumlayıcısıdır. Bash ayrıca Korn ve C kabuklarından (ksh ve csh) alınan kullanışlı özellikleri bünyesinde barındırır.

Bash'in, IEEE POSIX spesifikasyonunun (IEEE Standart 1003.1) Kabuk ve Yardımcı Programlar bölümünün uyumlu bir gerçeklemesi olması amaçlanmıştır. Bash, varsayılan olarak POSIX uyumlu olacak şekilde yapılandırılabilir.

Seçenekler

set yerleşik komutunun açıklamasında belgelenen tek karakterlik kabuk seçeneklerine ek olarak, bash başlatıldığında aşağıdaki seçenekleri yorumlar:

  • -c string: Eğer -c seçeneği varsa, komutlar string ifadesinden okunur. Eğer string ifadesinden sonra argümanlar varsa, bunlar $0'dan başlayarak konumsal parametrelere atanır.
  • -i: Eğer -i seçeneği varsa, kabuk etkileşimlidir.
  • -l: Bash'in bir oturum açma kabuğu (login shell) olarak başlatılmış gibi davranmasını sağlar (aşağıdaki BAŞLATMA bölümüne bakın).
  • -r: Eğer -r seçeneği varsa, kabuk kısıtlı hale gelir (aşağıdaki KISITLI KABUK bölümüne bakın).
  • -s: Eğer -s seçeneği varsa veya seçenek işlemleri tamamlandıktan sonra geriye hiçbir argüman kalmamışsa, komutlar standart girdiden okunur. Bu seçenek, etkileşimli bir kabuk başlatılırken konumsal parametrelerin ayarlanmasına olanak tanır.
  • -D: Önünde $ işareti bulunan tüm çift tırnaklı dizgilerin bir listesi standart çıktıya yazdırılır. Bunlar, geçerli yerel ayar C veya POSIX olmadığında dil çevirisine tabi olan dizgilerdir. Bu seçenek -n seçeneğini de beraberinde getirir; hiçbir komut yürütülmez.
  • [-+]O [shopt_seçeneği]: shopt_seçeneği, shopt yerleşik komutu tarafından kabul edilen kabuk seçeneklerinden biridir (aşağıdaki KABUK YERLEŞİK KOMUTLARI bölümüne bakın). shopt_seçeneği mevcutsa, -O bu seçeneğin değerini ayarlar; +O ise onu kaldırır. shopt_seçeneği belirtilmemişse, shopt tarafından kabul edilen kabuk seçeneklerinin adları ve değerleri standart çıktıya yazdırılır. Eğer başlatma seçeneği +O ise, çıktı girdi olarak yeniden kullanılabilecek bir biçimde görüntülenir.
  • --: -- seçeneği, seçeneklerin sonunu belirtir ve daha sonraki seçenek işlemlerini devre dışı bırakır. -- işaretinden sonraki tüm argümanlar dosya adları ve argümanlar olarak kabul edilir. - argümanı, -- ile eşdeğerdir.

Bash ayrıca bir dizi çok karakterli seçeneği de yorumlar. Bu seçeneklerin tanınabilmesi için komut satırında tek karakterlik seçeneklerden önce gelmesi gerekir.

  • --debugger: Kabuk başlamadan önce hata ayıklayıcı profilinin yürütülmesini ayarlar. Genişletilmiş hata ayıklama modunu (aşağıdaki shopt yerleşik komutunun extdebug seçeneği açıklamasına bakın) ve kabuk fonksiyonu takibini (aşağıdaki set yerleşik komutunun -o functrace seçeneği açıklamasına bakın) etkinleştirir.
  • --dump-po-strings: -D seçeneğine eşdeğerdir, ancak çıktı GNU gettext po (taşınabilir nesne) dosya biçimindedir.
  • --dump-strings: -D seçeneğine eşdeğerdir.
  • --help: Standart çıktıya bir kullanım mesajı yazdırır ve başarıyla çıkar.
  • --init-file dosya / --rcfile dosya: Kabuk etkileşimli ise, standart kişisel başlatma dosyası olan ~/.bashrc yerine belirtilen dosyadan komutları yürütür (aşağıdaki BAŞLATMA bölümüne bakın).
  • --login: -l seçeneğine eşdeğerdir.
  • --noediting: Kabuk etkileşimli olduğunda komut satırlarını okumak için GNU readline kütüphanesini kullanmaz.
  • --noprofile: Ne sistem genelindeki /etc/profile başlatma dosyasını ne de kişisel başlatma dosyaları olan ~/.bash_profile, ~/.bash_login veya ~/.profile dosyalarını okur. Varsayılan olarak bash, bir oturum açma kabuğu olarak başlatıldığında bu dosyaları okur (aşağıdaki BAŞLATMA bölümüne bakın).
  • --norc: Kabuk etkileşimli olsa bile kişisel başlatma dosyası olan ~/.bashrc dosyasını okuyup yürütmez. Kabuk sh adıyla başlatıldığında bu seçenek varsayılan olarak etkindir.
  • --posix: Varsayılan işleyişin POSIX standardından farklı olduğu durumlarda bash'in davranışını standartla eşleşecek şekilde değiştirir (posix modu).
  • --restricted: Kabuk kısıtlı hale gelir (aşağıdaki KISITLI KABUK bölümüne bakın).
  • --verbose: -v seçeneğine eşdeğerdir.
  • --version: Standart çıktıya bu bash örneğinin sürüm bilgilerini gösterir ve başarıyla çıkar.

Argümanlar

Seçenek işlemlerinden sonra geriye argümanlar kalırsa ve ne -c ne de -s seçeneği belirtilmemişse, ilk argümanın kabuk komutlarını içeren bir dosyanın adı olduğu kabul edilir. Bash bu şekilde başlatılırsa, $0 değişkeni dosya adına ayarlanır ve konumsal parametreler kalan argümanlara ayarlanır. Bash bu dosyadan komutları okur ve yürütür, ardından çıkar. Bash'in çıkış durumu, betikte yürütülen son komutun çıkış durumudur. Hiçbir komut yürütülmezse, çıkış durumu 0'dır. Önce dosya geçerli dizinde açılmaya çalışılır ve dosya bulunamazsa, kabuk betiği PATH içindeki dizinlerde arar.

Başlatma

Oturum açma kabuğu (login shell), sıfırıncı argümanının ilk karakteri - olan veya --login seçeneği ile başlatılan bir kabuktur.

Etkileşimli kabuk (interactive shell) ise seçenek dışı argümanlar ve -c seçeneği olmadan başlatılan, standart girdisi ile standart hatasının her ikisi de terminallere bağlı olan (isatty(3) ile belirlendiği üzere) veya -i seçeneği ile başlatılan bir kabuktur. Bash etkileşimli olduğunda PS1 değişkeni ayarlanır ve $- değişkeni i karakterini içerir, bu da bir kabuk betiğinin veya başlatma dosyasının bu durumu test etmesine olanak tanır.

Aşağıdaki paragraflar bash'in başlatma dosyalarını nasıl yürüttüğünü açıklamaktadır. Eğer dosyalardan herhangi biri mevcutsa ancak okunamıyorsa, bash bir hata bildirir. Dosya isimlerindeki tildeler (~), GENİŞLETME bölümündeki Tilde Genişletme başlığı altında açıklandığı gibi genişletilir.

Bash etkileşimli bir oturum açma kabuğu olarak veya --login seçeneğiyle etkileşimsiz bir kabuk olarak başlatıldığında, öncelikle /etc/profile dosyası mevcutsa bu dosyadaki komutları okur ve yürütür. Bu dosyayı okuduktan sonra sırasıyla ~/.bash_profile, ~/.bash_login ve ~/.profile dosyalarını arar ve mevcut ve okunabilir olan ilk dosyadan komutları okur ve yürütür. Kabuk başlatıldığında bu davranışı engellemek için --noprofile seçeneği kullanılabilir.

Bir oturum açma kabuğu çıktığında, bash mevcutsa ~/.bash_logout dosyasındaki komutları okur ve yürütür.

Oturum açma kabuğu olmayan etkileşimli bir kabuk başlatıldığında, bash mevcutsa ~/.bashrc dosyasındaki komutları okur ve yürütür. Bu durum --norc seçeneği kullanılarak engellenebilir. --rcfile dosya seçeneği, bash'i ~/.bashrc yerine belirtilen dosyadan komutları okuyup yürütmeye zorlar.

Bash, örneğin bir kabuk betiğini yürütmek üzere etkileşimsiz olarak başlatıldığında, ortamda BASH_ENV değişkenini arar, eğer mevcutsa değerini genişletir ve genişletilen değeri okunup yürütülecek bir dosyanın adı olarak kullanır. Bash, sanki aşağıdaki komut yürütülmüş gibi davranır:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

ancak dosya adını aramak için PATH değişkeninin değeri kullanılmaz.

Bash sh adıyla başlatılırsa, POSIX standartlarına uyum sağlarken eski sh sürümlerinin başlatma davranışını olabildiğince yakından taklit etmeye çalışır. Etkileşimli bir oturum açma kabuğu olarak veya --login seçeneğiyle etkileşimsiz bir kabuk olarak başlatıldığında, sırasıyla önce /etc/profile ve ardından ~/.profile dosyalarından komutları okumaya ve yürütmeye çalışır. Bu davranışı engellemek için --noprofile seçeneği kullanılabilir. sh adıyla etkileşimli bir kabuk olarak başlatıldığında bash, ENV değişkenini arar, tanımlanmışsa değerini genişletir ve genişletilen değeri okuyup yürütülecek bir dosyanın adı olarak kullanır. sh olarak başlatılan bir kabuk diğer hiçbir başlatma dosyasından komut okumaya ve yürütmeye çalışmadığı için, --rcfile seçeneğinin hiçbir etkisi yoktur. sh adıyla başlatılan etkileşimsiz bir kabuk, başka hiçbir başlatma dosyasını okumaya çalışmaz. sh olarak başlatıldığında, başlatma dosyaları okunduktan sonra bash posix moduna girer.

Bash, --posix komut satırı seçeneğiyle olduğu gibi posix modunda başlatıldığında, başlatma dosyaları için POSIX standardını izler. Bu modda etkileşimli kabuklar ENV değişkenini genişletir ve komutlar, genişletilen değere sahip dosyadan okunur ve yürütülür. Başka hiçbir başlatma dosyası okunmaz.

Bash, genellikle rshd olan uzak kabuk arka programı tarafından çalıştırılıp çalıştırılmadığını belirlemeye çalışır. Eğer bash, rshd tarafından çalıştırıldığını tespit ederse, mevcut ve okunabilir olması durumunda ~/.bashrc dosyasından komutları okur ve yürütür. sh olarak başlatılmışsa bunu yapmaz. Bu davranışı engellemek için --norc seçeneği, başka bir dosyanın okunmasını zorlamak için ise --rcfile seçeneği kullanılabilir; ancak rshd genellikle kabuğu bu seçeneklerle çağırmaz veya bu seçeneklerin belirtilmesine izin vermez.

Eğer kabuk, etkin kullanıcı (grup) kimliği gerçek kullanıcı (grup) kimliğine eşit olmadan başlatılırsa ve -p seçeneği belirtilmemişse, hiçbir başlatma dosyası okunmaz, kabuk fonksiyonları ortamdan miras alınmaz, ortamda mevcutsa SHELLOPTS değişkeni yok sayılır ve etkin kullanıcı kimliği gerçek kullanıcı kimliğine ayarlanır. Başlatma sırasında -p seçeneği sağlanırsa, başlatma davranışı aynı kalır, ancak etkin kullanıcı kimliği sıfırlanmaz.

Tanımlamalar

Aşağıdaki tanımlamalar belgenin geri kalanında kullanılmaktadır.

  • boşluk (blank): Bir boşluk veya sekme (tab) karakteri.
  • sözcük (word): Kabuk tarafından tek bir birim olarak kabul edilen karakter dizisi. Belirteç (token) olarak da bilinir.
  • ad (name): Yalnızca alfanümerik karakterlerden ve alt çizgilerden oluşan ve bir alfabetik karakter veya alt çizgiyle başlayan sözcük. Tanımlayıcı (identifier) olarak da adlandırılır.
  • meta karakter (metacharacter): Tırnak içine alınmadığında sözcükleri ayıran karakter. Şunlardan biridir: | & ; ( ) < > space tab
  • denetim işleci (control operator): Bir denetim işlevini yerine getiren belirteç. Aşağıdaki sembollerden biridir: || & && ; ;; ( ) | <yeni satır>

Ayrılmış Sözcükler

Ayrılmış sözcükler (reserved words), kabuk için özel anlamı olan sözcüklerdir. Aşağıdaki karakterler tırnak içine alınmadığında ve bir basit komutun ilk sözcüğü olduklarında veya bir case ya da for komutunun üçüncü sözcüğü olduklarında ayrılmış sözcük olarak kabul edilirler:

! case coproc do done elif else esac fi for function if in select then until while { } time [[ ]]

Kabuk Dil Bilgisi

Basit Komutlar

Basit bir komut (simple command), isteğe bağlı bir dizi değişken atamasını takip eden, boşluklarla ayrılmış sözcükler ve yönlendirmelerden oluşan ve bir denetim işleciyle sonlandırılan dizidir. İlk sözcük yürütülecek komutu belirtir ve sıfırıncı argüman olarak aktarılır. Kalan sözcükler yürütülecek komutun argümanları olarak aktarılır.

Basit bir komutun çıkış durumu (exit status), posix-2 standardında tanımlanan çıkış durumudur; komut bir sinyal n ile sonlandırılmışsa 128+n değeridir.

Boru Hatları

Bir boru hattı (pipeline), | veya |& denetim işleçlerinden biriyle ayrılmış bir veya daha fazla basit komuttan oluşan dizidir. Bir boru hattının biçimi şöyledir:

[time [-p]] [!] komut [ | veya |& komut2 ... ]

komut'un standart çıktısı, bir boru vasıtasıyla komut2'nin standart girdisine bağlanır. Bu bağlantı, komut tarafından belirtilen herhangi bir yönlendirmeden önce gerçekleştirilir. |& kullanılması, komut'un standart hatasının da bir boru aracılığıyla komut2'nin standart girdisine bağlanmasını sağlar; bu, 2>&1 | yönlendirmesinin kısaltmasıdır. Standart hatanın bu şekilde yönlendirilmesi, komut tarafından belirtilen her türlü yönlendirmeden sonra gerçekleştirilir.

Eğer ayrılmış sözcük ! boru hattının başında yer alıyorsa, boru hattının çıkış durumu, son komutun çıkış durumunun mantıksal olumsuzlamasıdır. Aksi takdirde, boru hattının çıkış durumu son komutun çıkış durumudur. Kabuk, boru hattındaki tüm komutların sonlanmasını bekledikten sonra bir değer döndürür.

Eğer boru hattından önce time ayrılmış sözcüğü yer alıyorsa, boru hattı sonlandığında komutun yürütülmesi için harcanan kullanıcı ve sistem süreleri rapor edilir. -p seçeneği, rapor biçimini POSIX tarafından belirtilen biçimle eşleşecek şekilde değiştirir. TIMEFORMAT değişkeni, zaman bilgilerinin nasıl görüntüleneceğini belirten bir biçim dizgisine ayarlanabilir (aşağıdaki Kabuk Değişkenleri açıklamasına bakın).

Boru hattındaki her bir komut, ayrı bir süreç olarak (yani bir alt kabukta) yürütülür.

Komut Dizileri

Bir komut dizisi (lists), bir veya daha fazla denetim işleci ;, &, && veya || ile ayrılmış ve isteğe bağlı olarak ;, & veya <yeni satır> işleçlerinden biriyle sonlandırılmış bir veya daha fazla boru hattından oluşan dizidir.

Bu dizi işleçleri arasında, && ve || işleçleri eşit önceliğe sahiptir; bunları ; ve & işleçleri takip eder ve bu işleçler de eşit önceliğe sahiptir.

Komutların sonlandırılması için ; yerine bir veya daha fazla yeni satır karakteri kullanılabilir.

Bir komut & denetim işleciyle sonlandırılırsa, kabuk komutu arka planda bir alt kabukta yürütür. Kabuk, komutun sonlanmasını beklemez ve çıkış durumu 0 döndürür.

Noktalı virgül ; ile ayrılmış komutlar sırayla yürütülür; kabuk her bir komutun sonlanmasını bekler. Çıkış durumu, yürütülen son komutun çıkış durumudur.

&& ve || denetim işleçleri sırasıyla VE (AND) ve VEYA (OR) listelerini belirtir. Bir VE listesinin biçimi şöyledir:

komut1 && komut2

komut2, yalnızca ve ancak komut1 sıfır çıkış durumu döndürürse yürütülür.

Bir VEYA listesinin biçimi şöyledir:

komut1 || komut2

komut2, yalnızca ve ancak komut1 sıfır dışı bir çıkış durumu döndürürse yürütülür. VE ve VEYA listelerinin çıkış durumu, listede yürütülen son komutun çıkış durumudur.

Bileşik Komutlar

Bileşik bir komut (compound command) aşağıdakilerden biridir:

  • (liste): liste komutları bir alt kabuk ortamında yürütülür (aşağıdaki KABUK YÜRÜTME ORTAMI bölümüne bakın). Kabuk ortamını etkileyen değişken atamaları ve yerleşik komutlar komut tamamlandıktan sonra geçerliliğini korumaz. Çıkış durumu listenin çıkış durumudur.

  • { liste; }: liste komutları geçerli kabuk ortamında yürütülür. liste bir yeni satır veya noktalı virgülle sonlandırılmalıdır. Bu, grup komutu (group command) olarak bilinir. Çıkış durumu listenin çıkış durumudur. Parantezlerin aksine, { ve } karakterleri kabuk ayrılmış sözcükleridir. Bunların tanınabilmesi için, bir meta karakterle ayrılmış olmaları veya bir satırın başında bulunmaları gerekir. } sözcüğü bir ayrılmış sözcük olduğundan, bir denetim işleci veya yeni satır ile listenin geri kalanından ayrılmalıdır.

  • ((ifade)): ifade aritmetik ifadesi, aşağıda ARİTMETİK DEĞERLENDİRME başlığı altında açıklanan kurallara göre değerlendirilir. İfadenin değeri sıfır dışı ise, çıkış durumu 0'dır; aksi takdirde çıkış durumu 1'dir. Bu komut tam olarak let "ifade" ile eşdeğerdir.

  • [[ ifade ]]: ifade koşullu ifadesinin değerlendirmesine bağlı olarak 0 veya 1 durumu döndürür. İfadeler, aşağıda KOŞULLU İFADELER başlığı altında açıklanan birincillerden oluşur. [[ ve ]] sözcükleri arasında sözcük bölme ve dosya adı genişletmesi gerçekleştirilmez; tilde genişletmesi, parametre ve değişken genişletmesi, aritmetik genişletme, komut değiştirme, süreç değiştirme ve tırnak temizleme gerçekleştirilir. -f gibi koşullu işleçlerin geçerli olabilmesi için tırnak içine alınmamış olmaları gerekir.

    [[ ile birlikte kullanıldığında, < ve > işleçleri geçerli yerel ayarın karakter sıralamasına göre sözcükleri alfabetik olarak karşılaştırır.

    İfadeleri birleştirmek için aşağıdaki işleçler kullanılabilir:

    • ( ifade ): ifade'nin değerini döndürür. Bu, işleçlerin normal önceliğini geçersiz kılmak için kullanılabilir.
    • ! ifade: ifade yanlışsa doğrudur.
    • ifade1 && ifade2: Hem ifade1 hem de ifade2 doğruysa doğrudur.
    • ifade1 || ifade2: ifade1 veya ifade2'den biri doğruysa doğrudur.

    && ve || işleçleri, sol tarafın sonucu sağ tarafın değerlendirilip değerlendirilmeyeceğini belirlediği için kısa devre değerlendirme (short-circuit evaluation) gerçekleştirir.

    İkili = ve == işleçleri kullanıldığında, işlecin sağındaki sözcük bir desen olarak kabul edilir ve aşağıda Dosya Yolu Genişletme başlığı altında açıklanan kurallara göre desen eşleştirmesi gerçekleştirilir. Eşleşme sağlanırsa dönüş değeri 0, aksi takdirde 1'dir. Desenin herhangi bir bölümü tırnak içine alınırsa, tırnak içine alınmış kısım harfi harfine (literal string) eşleştirilir.

    Ek bir ikili işleç olan =~ de kullanılabilir ve işlecin sağındaki sözcük bir genişletilmiş düzenli ifade (extended regular expression) olarak kabul edilir ve regcomp(3) ile regexec(3) kurallarına göre eşleştirilir. Desen eşleşirse dönüş değeri 0, aksi takdirde 1'dir. Desen geçersiz ise, koşullu ifade 2 değerini döndürür. Desenin herhangi bir bölümü tırnak içine alınrısa, tırnak içine alınmış kısım harfi harfine eşleştirilir. Bu durum, düzenli ifadelerde özel anlamı olan karakterlerin özel anlamlarını kaybetmelerini sağlar. Desen içindeki alt ifadelere (subexpressions) eşleşen dizgiler, BASH_REMATCH dizi değişkenine kaydedilir. BASH_REMATCH dizisinin 0. öğesi, tüm düzenli ifadeyle eşleşen kısımdır. BASH_REMATCH dizisinin n. öğesi, n. parantezli alt ifadeyle eşleşen kısımdır.

    expression1 -a expression2 ve expression1 -o expression2 işleçleri [[ komutu içinde kullanılamaz. Bunların yerine sırasıyla && ve || işleçleri kullanılmalıdır.

  • for ad [ [ in [ sözcük ... ] ] ; ] do liste ; done: in'i takip eden sözcükler genişletilerek bir öğe listesi oluşturulur. ad değişkeni sırasıyla bu listedeki her bir öğeye ayarlanır ve liste her seferinde yürütülür. Eğer in sözcük kısmı atlanırsa, for komutu mevcut olan konumsal parametreleri sırasıyla yürütür (aşağıdaki PARAMETRELER bölümüne bakın). Çıkış durumu, yürütülen son liste komutunun çıkış durumudur. in genişletmesinden sonraki öğeler listesi boş ise hiçbir komut yürütülmez ve çıkış durumu 0'dır.

  • for (( ifade1 ; ifade2 ; ifade3 )) ; do liste ; done: İlk olarak ifade1 aritmetik ifadesi, aşağıda açıklanan kurallara göre değerlendirilir (bkz. ARİTMETİK DEĞERLENDİRME). Ardından, ifade2 aritmetik ifadesi sıfır değerini verene kadar liste tekrar tekrar değerlendirilir. ifade2 her değerlendirildiğinde ve sıfır dışı bir değer verdiğinde liste yürütülür ve ardından ifade3 aritmetik ifadesi değerlendirilir. İfadelerden herhangi biri atlanırsa, sanki 1 değerini veriyormuş gibi kabul edilir. Çıkış durumu, yürütülen son liste komutunun çıkış durumudur; ifadelerden herhangi biri geçersiz ise dönüş değeri yanlıştır (false).

  • select ad [ in sözcük ... ] ; do liste ; done: in'i takip eden sözcükler genişletilerek bir öğe listesi oluşturulur. Genişletilmiş sözcükler kümesi, önlerinde satır numaraları olacak şekilde standart hata çıktısına yazdırılır. Eğer in sözcük kısmı atlanırsa, konumsal parametreler yazdırılır (aşağıdaki PARAMETRELER bölümüne bakın). Ardından PS3 istemi görüntülenir ve standart girdiden bir satır okunur. Eğer satır, görüntülenen sözcüklerden birine karşılık gelen bir sayı içeriyorsa, ad değişkeninin değeri o sözcüğe ayarlanır. Eğer satır boş ise, sözcükler ve istem tekrar görüntülenir. Eğer dosya sonu (EOF) okunursa komut sonlandırılır. Okunan diğer her türlü değer için ad değişkeninin değeri boş (null) olarak ayarlanır. Okunan satır REPLY değişkenine kaydedilir. liste her seçimden sonra, bir break komutuyla karşılaşılana kadar yürütülür. select komutunun çıkış durumu, yürütülen son liste komutunun çıkış durumudur; hiçbir komut yürütülmemişse çıkış durumu 0'dır.

  • case sözcük in [ [(] desen [ | desen ] ... ) liste ;; ] ... esac: case komutu önce sözcük ifadesini genişletir, ardından sırasıyla her bir desene karşı, Dosya Yolu Genişletme başlığı altında açıklanan kuralları kullanarak eşleştirmeye çalışır. Eşleşen ilk desene karşılık gelen liste yürütülür. Eğer ;; işleci kullanılmışsa, ilk eşleşmeden sonra başka hiçbir desen eşleştirmesi denenmez. Eğer ;& işleci kullanılmışsa, bu desene karşılık gelen listenin yürütülmesi tamamlandıktan sonra, bir sonraki desene karşılık gelen liste de eşleştirme denenmeden doğrudan yürütülür (fall-through). Eğer ;;& işleci kullanılmışsa, kabuk listeden sonraki desenleri eşleştirmeye devam eder ve sonraki bir eşleşen desene karşılık gelen listeyi yürütür. Çıkış durumu, hiçbir desen eşleşmezse 0'dır. Aksi takdirde, yürütülen son liste komutunun çıkış durumudur.

  • if liste; then liste; [ elif liste; then liste; ] ... [ else liste; ] fi: if liste yürütülür. Çıkış durumu 0 ise then liste yürütülür. Aksi takdirde, sırasıyla her bir elif liste yürütülür ve çıkış durumu 0 ise ilgili then liste yürütülür. Hiçbiri sıfır döndürmezse else liste yürütülür. Çıkış durumu, yürütülen son komutun çıkış durumudur; hiçbir koşul doğru çıkmazsa çıkış durumu 0'dır.

  • while liste-1; do liste-2; done

  • until liste-1; do liste-2; done: while komutu, liste-1 içindeki son komut sıfır çıkış durumu döndürdüğü sürece liste-2 komutlarını tekrar tekrar yürütür. until komutu ise, liste-1 içindeki son komut sıfır dışı bir çıkış durumu döndürdüğü sürece liste-2 komutlarını tekrar tekrar yürütür. Çıkış durumu, liste-2 içinde yürütülen son komutun çıkış durumudur; hiçbir komut yürütülmemişse çıkış durumu 0'dır.

Eşzamanlı Süreçler (Coproc)

Bir eşzamanlı süreç (coprocess), coproc ayrılmış sözcüğü kullanılarak arka planda bir alt kabukta yürütülen kabuk komutudur. Yürütülen komut, çağıran kabukla iki yönlü bir boru hattı (two-way pipe) aracılığıyla bağlanır.

Bir eşzamanlı sürecin biçimi şöyledir:

coproc [ad] komut [yönlendirmeler]

Bu biçim, ad adında bir eşzamanlı süreç oluşturur. ad belirtilmemişse varsayılan ad COPROC olur. ad, bir kabuk değişkeni adı olarak kullanılamayacak bir sözcük olmamalıdır; aksi takdirde coproc bir basit komutun ilk sözcüğü olarak kabul edilir.

Eşzamanlı süreç yürütüldüğünde, çağıran kabukta ad adında bir dizi değişkeni (aşağıdaki Diziler bölümüne bakın) oluşturulur. komut'un standart çıktısı çağıran kabukta bir dosya tanımlayıcısına bağlanır ve bu tanımlayıcı ad[0] değişkenine atanır. komut'un standart girdisi çağıran kabukta bir dosya tanımlayıcısına bağlanır ve bu tanımlayıcı ad[1] değişkenine atanır. Bu borular, komut tarafından belirtilen herhangi bir yönlendirmeden önce oluşturulur (aşağıdaki Yönlendirme bölümüne bakın). Bu dosya tanımlayıcıları, standart kabuk komutlarında ve yönlendirmelerinde kelime genişletmesi kullanılarak argüman olarak aktarılabilir. coproc komutunu yürütmek için oluşturulan alt kabuğun süreç kimliği (PID), ad_PID değişkenine atanır. Yerleşik wait komutu, eşzamanlı sürecin sonlanmasını beklemek için kullanılabilir.

Çıkış durumu, coproc komutunu içeren alt kabuğun çıkış durumudur.

Kabuk Fonksiyonu Tanımlamaları

Kabuk fonksiyonu (shell function), bir basit komut adı gibi çağrılabilen ve kendi konumsal parametreleriyle bir bileşik komutu yürüten nesnedir. Kabuk fonksiyonları aşağıdaki biçimlerden biriyle tanımlanır:

  • ad () bileşik-komut [yönlendirme]
  • function ad [()] bileşik-komut [yönlendirme]

Bu biçimler, ad adında bir fonksiyon tanımlar. function ayrılmış sözcüğü kullanılıyorsa, parantezler isteğe bağlıdır. Fonksiyon gövdesi, genellikle { ve } ile gruplanmış bir bileşik-komut'tur (yukarıdaki Bileşik Komutlar bölümüne bakın). ad bir komut olarak çağrıldığında, bileşik-komut yürütülür. Fonksiyona belirtilen her türlü yönlendirme, fonksiyon yürütüldüğünde gerçekleştirilir.

Bir fonksiyon tanımı, unset yerleşik komutuna -f seçeneği verilerek silinebilir (aşağıdaki KABUK YERLEŞİK KOMUTLARI bölümüne bakın).

Fonksiyon tanımlandığı kabuk ortamında yürütülür; fonksiyonu yürütmek için yeni bir süreç oluşturulmaz (bir alt kabukta yürütülen bileşik komutlar hariç).

Bir fonksiyon yürütülürken, fonksiyona aktarılan argümanlar fonksiyon yürütülürken konumsal parametreler haline gelir. Özel parametre #, fonksiyona aktarılan argüman sayısını yansıtacak şekilde güncellenir. Sıfırıncı konumsal parametre ($0) değişmez. Fonksiyon yürütülürken, FUNCNAME dizi değişkeninin ilk öğesi fonksiyonun adına ayarlanır.

Kabuk ortamının tüm yönleri çağıran kabuk ve fonksiyon arasında paylaşılır; ancak DEBUG ve RETURN trap'leri (aşağıdaki KABUK YERLEŞİK KOMUTLARI altındaki trap açıklamasına bakın) fonksiyon tarafından miras alınmaz, unless set yerleşik komutuyla -T seçeneği etkinleştirilmiş veya functrace kabuk seçeneği shopt ile ayarlanmışsa (bu durumda tüm fonksiyonlar DEBUG ve RETURN trap'lerini miras alır). Eğer DEBUG trap'i miras alınmıyorsa, izleme (trace) özniteliğine sahip fonksiyonlar (aşağıdaki declare yerleşik komutunun açıklamasına bakın) DEBUG ve RETURN trap'lerini miras alacaktır. Eğer ERR trap'i miras alınmıyorsa, errtrace kabuk seçeneği etkinleştirilmedikçe fonksiyonlar ERR trap'ini miras almaz.

Fonksiyon içindeki yerel değişkenler local yerleşik komutu kullanılarak bildirilebilir. Normalde yerel değişkenler ve değerleri yalnızca fonksiyon kapsamında geçerlidir.

Eğer fonksiyon içinde return yerleşik komutu yürütülürse, fonksiyon sonlandırılır ve yürütme, fonksiyon çağrısından sonraki komutla devam eder. return komutuna verilen değer fonksiyonun çıkış durumu olur. Fonksiyon tamamlandığında konumsal parametrelerin değerleri ve # parametresi, fonksiyon çağrılmadan önceki değerlerine geri döndürülür.

Fonksiyon adları ve tanımları, declare veya typeset yerleşik komutlarına verilen -f seçeneğiyle listelenebilir. declare veya typeset komutuna verilen -F seçeneği yalnızca fonksiyon adlarını listeler (shopt ile extglob seçeneği etkinse kaynak dosya adı ve satır numarasını da görüntüler). Fonksiyonler, export yerleşik komutuna verilen -f seçeneği kullanılarak, alt kabukların bunları otomatik olarak tanımlayabilmesi için dışa aktarılabilir.

Fonksiyon tanımları alt kabuklara aktarılabilir, ancak kabuk fonksiyonları iç içe geçmiş olamaz.

Bir fonksiyonun dönüş durumu, fonksiyon gövdesinde yürütülen son komutun durumudur. Boş bir fonksiyon için dönüş durumu 0'dır.

Yorumlar

Etkileşimsiz bir kabukta veya shopt yerleşik komutunun interactive_comments seçeneği etkinleştirilmiş etkileşimli bir kabukta (aşağıdaki KABUK YERLEŞİK KOMUTLARI bölümüne bakın), bir sözcüğün # karakteriyle başlaması, o sözcüğün ve satırdaki diğer tüm karakterlerin yok sayılmasına neden olur. # ile başlayan satırlar tamamen yorum satırıdır ve yürütmeliz.

Genişletme (Expansion)

Komut satırı girilip kelimelere bölündükten sonra genişletme işlemleri uygulanır. Bu genişletmeler sırasıyla şunlardır:

  1. Küme Genişletme (Brace Expansion)
  2. Tilde Genişletme (Tilde Expansion)
  3. Parametre ve Değişken Genişletme (Parameter and Variable Expansion)
  4. Aritmetik Genişletme (Arithmetic Expansion)
  5. Komut Değiştirme (Command Substitution)
  6. Süreç Değiştirme (Process Substitution)
  7. Kelime Bölme (Word Splitting)
  8. Dosya Yolu Genişletme (Filename Expansion)

Genişletmelerin sırası şöyledir: küme genişletme; tilde genişletme, parametre ve değişken genişletme, aritmetik genişletme ve komut değiştirme (soldan sağa doğru yürütülür); kelime bölme; ve dosya yolu genişletme.

Bunu destekleyen sistemlerde, ek bir genişletme olan süreç değiştirme (process substitution), tilde, parametre, değişken, aritmetik genişletme ve komut değiştirme ile aynı anda gerçekleştirilir.

Yalnızca küme genişletme, kelime bölme ve dosya yolu genişletme genişletilen kelime sayısını değiştirebilir; diğer genişletmeler tek bir kelimeyi başka bir tek kelimeye genişletir. Tek istisna, aşağıda açıklandığı gibi "$@" ve "${ad[@]}" genişletmeleridir.

Küme Genişletme (Brace Expansion)

Küme genişletme, rastgele dizgilerin üretilmesini sağlayan bir mekanizmadır. Bu mekanizma dosya yolu genişletmesine benzer, ancak üretilen dosya adlarının mevcut olması gerekmez. Küme genişletmesi yapılacak desenlerin biçimi, isteğe bağlı bir önek (preamble), ardından küme parantezleri içinde virgülle ayrılmış bir dizi dizgi veya bir dizi ifadesi (sequence expression) ve isteğe bağlı bir sonek (postscript) şeklindedir. Önek, küme parantezleri içindeki her bir dizginin başına eklenir ve sonek de her bir elde edilen dizginin sonuna eklenir.

Küme genişletmeleri iç içe yerleştirilebilir. Genişletilen dizgilerin sonuçları sıralanmaz; soldan sağa doğru sıra korunur. Örneğin, a{d,c,b}e ifadesi ade ace abe olarak genişletilir.

Dizi ifadesi {x..y[..artan]} biçimindedir; burada x ve y ya birer tamsayı ya da tek birer karakterdir ve isteğe bağlı olan artan değeri tamsayıdır. x ve y tamsayı olduğunda, ifade x ile y arasındaki (dahil) her bir sayıyı üretecek şekilde genişletilir. Üretilen sayılar, her sayının önüne sıfır eklenerek aynı genişlikte olması sağlanabilir (örn. {01..09}). x ve y karakter olduğunda ise ifade, geçerli yerel ayarın karakter sıralamasına göre x ile y arasındaki karakterleri üretecek şekilde genişletilir. artan belirtilmişse, öğeler arasındaki farkı belirtir. Varsayılan artan değeri, yönüne bağlı olarak 1 veya -1'dir.

Küme genişletme, diğer tüm genişletmelerden önce gerçekleştirilir ve diğer genişletmeler için özel olan tüm karakterler sonuçta korunur. Bu işlem tamamen harfi harfine (literal) uygulanır. Bash, küme genişletmesinin bağlamına veya küme parantezleri arasındaki metne herhangi bir söz dizimsel yorum uygulamaz.

Doğru biçimlendirilmiş bir küme genişletmesi, tırnak içine alınmamış açma ve kapama küme parantezleri ile tırnak içine alınmamış en az bir virgül veya geçerli bir dizi ifadesi içermelidir. Doğru biçimlendirilmemiş herhangi bir küme genişletmesi değişmeden bırakılır. { veya , karakteri önlerine ters eğik çizgi eklenerek küme genişletmesi olarak kabul edilmekten kaçınılabilir. Küme genişletmesinin bir parametre genişletmesiyle çakışmasını önlemek için ${ dizisi küme genişletmesi olarak kabul edilmez.

Bu mekanizma, ortak bir ön eki olan dosya adlarının kısaltılarak yazılmasında sıkça kullanılır:

mkdir /usr/local/src/bash/{yedek,belge,kaynak,test}

veya

chown root /usr/{bin,sbin,lib,libexec}/{dosya1,dosya2}

Küme genişletmesi, geleneksel sh sürümleriyle geriye dönük uyumluluk sağlamak amacıyla varsayılan olarak etkindir. Kabuk etkileşimli veya etkileşimsiz olarak başlatıldığında, set yerleşik komutuna verilen +B seçeneğiyle küme genişletmesi devre dışı bırakılabilir (aşağıdaki KABUK YERLEŞİK KOMUTLARI bölümüne bakın).

Tilde Genişletme (Tilde Expansion)

Bir kelime tırnak içine alınmamış bir tilde karakteri (~) ile başlıyorsa, tırnak içine alınmamış ilk eğik çizgiye kadar olan tüm karakterler (veya eğik çizgi yoksa tüm karakterler) bir tilde-önek (tilde-prefix) olarak kabul edilir. Tilde-önek içindeki hiçbir karakter tırnak içine alınmamışsa, tilde-önekten sonraki karakterlerin bir kullanıcı adı (login name) olduğu varsayılır. Bu kullanıcı adı boş bir dizgi ise, tilde yerine HOME kabuk değişkeninin değeri yerleştirilir. HOME ayarlanmamışsa, kabuğu çalıştıran kullanıcının ev dizini yerleştirilir. Aksi takdirde, tilde-önek belirtilen kullanıcı adıyle ilişkili ev diziniyle değiştirilir.

Eğer tilde-önek ~+ ise, tilde-önek yerine geçerli çalışma dizinini tutan PWD kabuk değişkeninin değeri yerleştirilir. Eğer tilde-önek ~- ise, tilde-önek yerine eğer ayarlanmışsa bir önceki çalışma dizinini tutan OLDPWD kabuk değişkeninin değeri yerleştirilir.

Tilde-önek içindeki tilde karakterini takip eden karakterler bir tamsayıyı belirtiyorsa (önünde isteğe bağlı bir + veya - işareti bulunabilir), bu tamsayı n dizin yığınındaki (directory stack) n. dizini belirtir (dirs yerleşik komutunun açıklamasına bakın). Tilde-önek yerine yığındaki ilgili dizin yerleştirilir; tamsayıdan önce + işareti varsa soldan, - işareti varsa sağdan sayılır.

Eğer tilde-önek içindeki tilde karakterinden sonraki kısım geçerli bir kullanıcı adını veya dizin yığını girdisini belirtmiyorsa, tilde-önek genişletilmeden olduğu gibi bırakılır.

Değişken atamalarında, : veya = karakterlerinden hemen sonra gelen tırnak içine alınmamış tildeler de tilde genişletmesine tabi tutulur. Bu durumlarda, : veya = karakterinden sonraki ilk eğik çizgiye kadar olan kısım tilde-önek olarak kabul edilir ve tilde genişletmesi gerçekleştirilir.

Parametre Genişletmesi (Parameter Expansion)

$ karakteri, parametre genişletmesini, komut değiştirmesini veya aritmetik genişletmeyi başlatır. Genişletilecek parametre adı veya sembolü, isteğe bağlı olarak küme parantezleri içine alınabilir. Küme parantezleri, parametrenin hemen ardından gelen ve adın bir parçası olarak yorumlanabilecek karakterlerden parametre adını ayırmak için kullanılır.

Küme parantezleri kullanıldığında, eşleşen kapama parantezi, ters eğik çizgiyle kaçırılmamış veya tırnak içine alınmış bir dizgi içinde olmayan ilk } karakteridir. Bu durum, iç içe geçmiş aritmetik genişletmeler, komut değiştirmeleri ve parametre genişletmelerinde doğru şekilde çalışır.

Genişletmenin temel biçimi ${parametre} şeklindedir. parametre'nin değeri yerleştirilir. parametre bir veya daha fazla basamaklı bir sayı olan bir konumsal parametre ise veya parametre'yi bir işleç takip ediyorsa küme parantezleri zorunludur.

Eğer parametre'nin ilk karakteri bir ünlem işareti (!) ise, bir değişken dolaylı yönlendirmesi (variable indirection) düzeyi tanıtılır. Bash, parametre'nin kalan karakterlerinden oluşan değişkeni genişletir ve bu genişletilmiş değeri asıl genişletilecek değişkenin adı olarak kullanır. Bu asıl değişken genişletilerek sonuç elde edilir. Bu durum dolaylı genişletme (indirect expansion) olarak bilinir. Bunun istisnaları, aşağıda açıklanan ${!önek*} ve ${!ad[@]} genişletmeleridir. Dolaylı yönlendirmeyi belirtmek için kullanılan ünlem işareti, hemen ${ işaretinden sonra gelmelidir.

Aşağıdaki durumlarda, parametre'nin değeri üzerinde ek işlemler gerçekleştirilebilir.

  • ${parametre:-sözcük}: Varsayılan Değerleri Kullan. Eğer parametre ayarlanmamış (unset) veya boş (null) ise, sözcük genişletilerek parametre yerine yerleştirilir. Aksi takdirde, parametre'nin kendi değeri yerleştirilir.

  • ${parametre:=sözcük}: Varsayılan Değerleri Ata. Eğer parametre ayarlanmamış veya boş ise, sözcük genişletilir ve parametre'ye atanır. Ardından parametre'nin yeni değeri yerleştirilir. Konumsal parametreler ve özel parametreler bu şekilde atanamaz.

  • ${parametre:?sözcük}: Boş veya Ayarlanmamışsa Hata Göster. Eğer parametre ayarlanmamış veya boş ise, sözcük genişletmesi standart hataya yazdırılır ve kabuk, etkileşimli değilse sıfır olmayan bir durumla çıkar. Aksi takdirde, parametre'nin kendi değeri yerleştirilir. Eğer sözcük atlanırsa, varsayılan bir hata mesajı görüntülenir.

  • ${parametre:+sözcük}: Alternatif Değer Kullan. Eğer parametre ayarlanmamış veya boş ise hiçbir şey yerleştirilmez. Aksi takdirde, sözcük genişletilerek yerleştirilir.

  • ${parametre:sapma} / ${parametre:sapma:uzunluk}: Alt Dizgi Genişletmesi. parametre'nin sapma konumundan başlayan uzunluk karakter kadar olan alt dizgisine genişletilir. parametre bir dizi ise, bu dizi öğelerinin bir alt kümesine genişletilir. sapma ve uzunluk aritmetik ifadelerdir (aşağıdaki ARİTMETİK DEĞERLENDİRME bölümüne bakın). uzunluk sıfırdan büyük veya eşit olmalıdır. sapma negatif bir sayı olarak değerlendirilirse, bu değer parametre'nin sonundan başlayan bir karakter sapması olarak kullanılır. sapma aritmetik ifadesi negatif bir sayıya değerlendirildiğinde, ${parametre:-sözcük} genişletmesiyle çakışmasını önlemek için parametre ile sapma arasına en az bir boşluk bırakılmalıdır. uzunluk negatif bir sayı olarak değerlendirilirse, bu değer parametre'nin sonundan başlayan bir sapma olarak kabul edilir ve karakter sayısı yerine o konuma kadar olan alt dizgi alınır. parametre @ ise, sonuç sapma konumundan başlayan uzunluk kadar konumsal parametre olur. parametre * veya @ ile dizinlenmiş bir dizi değişkeni ise, sonuç sapma konumundan başlayan uzunluk kadar dizi öğesi olur.

  • ${!önek*} / ${!önek@}: Önek ile Eşleşen Değişken Adları. önek ile başlayan tüm kabuk değişkenlerinin adlarına genişletilir ve adlar IFS özel değişkeninin ilk karakteriyle ayrılarak listelenir. @ kullanıldığında ve genişletme çift tırnak içine alındığında, her bir değişken adı ayrı bir kelime olarak genişletilir.

  • ${!ad[*]} / ${!ad[@]}: Dizi Anahtarları Listesi. ad bir dizi değişkeni ise, dizi içinde atanmış olan indekslerin (anahtarların) listesine genişletilir. ad bir dizi değilse, ad ayarlanmışsa 0, aksi takdirde boş (null) değerine genişletilir. @ kullanıldığında ve genişletme çift tırnak içine alındığında, her bir anahtar ayrı bir kelime olarak genişletilir.

  • ${#parametre}: Parametre Uzunluğu. parametre'nin değerinin karakter uzunluğuna genişletilir. parametre * veya @ ise, genişletilen değer konumsal parametrelerin sayısıdır. parametre * veya @ ile dizinlenmiş bir dizi adı ise, genişletilen değer dizideki öğe sayısıdır.

  • ${parametre#desen} / ${parametre##desen}: En Kısa/En Uzun Ön Eki Kaldır. desen genişletilerek bir desen oluşturulur (dosya yolu genişletmesindeki gibi). desen, parametre'nin değerinin başıyla eşleşiyorsa, en kısa eşleşen kısım (# ile) veya en uzun eşleşen kısım (## ile) silinir ve kalan kısım yerleştirilir. parametre @ veya * ise, kaldırma işlemi sırasıyla her bir konumsal parametreye uygulanır ve sonuç kelime listesi olur. parametre * veya @ ile dizinlenmiş bir dizi değişkeni ise, kaldırma işlemi sırasıyla dizinin her bir üyesine uygulanır ve sonuç kelime listesi olur.

  • ${parametre%desen} / ${parametre%%desen}: En Kısa/En Uzun Son Eki Kaldır. desen genişletilerek bir desen oluşturulur. desen, parametre'nin değerinin sonuyla eşleşiyorsa, en kısa eşleşen kısım (% ile) veya en uzun eşleşen kısım (%% ile) silinir ve kalan kısım yerleştirilir. parametre @ veya * ise, kaldırma işlemi sırasıyla her bir konumsal parametreye uygulanır ve sonuç kelime listesi olur. parametre * veya @ ile dizinlenmiş bir dizi değişkeni ise, kaldırma işlemi sırasıyla dizinin her bir üyesine uygulanır ve sonuç kelime listesi olur.

  • ${parametre/desen/dizgi}: Desen Değiştirme. desen genişletilerek bir desen oluşturulur. parametre genişletilir ve desen ile en uzun eşleşen kısım dizgi ile değiştirilir. desen / ile başlıyorsa, desenin tüm geçişleri dizgi ile değiştirilir. Normalde yalnızca ilk eşleşen kısım değiştirilir. desen # ile başlıyorsa, parametre'nin başındaki eşleşen kısım değiştirilir. desen % ile başlıyorsa, parametre'nin sonundaki eşleşen kısım değiştirilir. dizgi boş ise, eşleşen kısım silinir ve desenden sonraki / atlanabilir. parametre @ veya * ise, değiştirme işlemi sırasıyla her bir konumsal parametreye uygulanır ve sonuç kelime listesi olur. parametre * veya @ ile dizinlenmiş bir dizi değişkeni ise, değiştirme işlemi sırasıyla dizinin her bir üyesine uygulanır ve sonuç kelime listesi olur.

Komut Değiştirme (Command Substitution)

Komut değiştirme, bir komutun standart çıktısının, komutun kendisinin yerini almasını sağlar. Komut değiştirme biçimi şöyledir:

$(komut)

veya eski biçim olan:

\komut``

Bash, komut'u bir alt kabuk ortamında yürütür ve standart çıktısını alır. Çıktıdaki tüm sondaki yeni satır karakterleri silinir. Çıktının ortasında yer alan yeni satırlar silinmez, ambalajlı kelime bölme sırasında kelimelere ayrılabilirler. $(cat dosya) komutunun yerine daha hızlı çalışan $(< dosya) biçimi kullanılabilir.

Eski tarz ters tırnaklı (backquote) değiştirme kullanıldığında, ters eğik çizgi özel anlamını yalnızca $, `, \ ve ters tırnak takibinde korur. Önünde ters eğik çizgi olmayan ters tırnaklar komut değiştirmenin sonunu belirtir. $(komut) biçimi kullanıldığında ise, parantezler arasındaki tüm karakterler komutun kendisini oluşturur; hiçbir karakter özel olarak kaçırılmak zorunda değildir.

Komut değiştirmeleri iç içe yerleştirilebilir. Eski tarz ters tırnaklı değiştirme kullanılırken iç içe yerleştirmek için içteki ters tırnaklar ters eğik çizgiyle kaçırılmalıdır.

Eğer genişletme çift tırnaklar içinde bulunuyorsa, komut değiştirmenin sonuçlarında kelime bölme ve dosya adı genişletmesi gerçekleştirilmez.

Aritmetik Genişletme (Arithmetic Expansion)

Aritmetik genişletme, bir aritmetik ifadenin değerlendirilmesini ve sonucun yerleştirilmesini sağlar. Aritmetik genişletme biçimi şöyledir:

$((ifade))

ifade aritmetik ifadesi, çift tırnaklar içindeymiş gibi değerlendirilir, ancak parantez içindeki çift tırnaklar özel olarak işlenmez. İfadedeki tüm parametre ve değişken genişletmeleri, aritmetik genişletme yürütülmeden önce gerçekleştirilir. Aritmetik genişletmeler iç içe yerleştirilebilir.

İfadenin değerlendirilmesi, aşağıda ARİTMETİK DEĞERLENDİRME başlığı altında açıklanan kurallara göre gerçekleştirilir. ifade geçersiz ise, bash bir hata bildirir ve çıkış durumu olarak sıfır dışı bir değer döndürür.

Süreç Değiştirme (Process Substitution)

Süreç değiştirme, bir borunun (named pipe veya /dev/fd altındaki dosya tanımlayıcıları) dosya adı argümanı olarak kullanılmasına olanak tanır. Süreç değiştirme biçimi, bir komutun parantez içine alınması ve önüne < veya > eklenmesi şeklindedir:

<(komut)

veya:

>(komut)

komut süreç kimliği arka planda bir alt kabukta çalıştırılır ve standart girdisi veya çıktısı bir dosya adı olarak temsil edilen geçici bir boruya bağlanır. Bu dosya adı, komut yürütüldüğünde argüman olarak aktarılır. <(komut) biçimi kullanıldığında, bu dosyadan okuma yapmak komut'un standart çıktısını okumakla eşdeğerdir. >(komut) biçimi kullanıldığında ise, bu dosyaya yazmak komut'un standart girdisine yazmakla eşdeğerdir.

Süreç değiştirme, bunu destekleyen sistemlerde parametre, değişken, aritmetik genişletme ve komut değiştirme ile aynı anda gerçekleştirilir.

Kelime Bölme (Word Splitting)

Çift tırnak içinde olmayan parametre genişletmeleri, komut değiştirmeleri ve aritmetik genişletmeler, kelime bölme (word splitting) işlemine tabi tutulur. Kabuk, genişletmelerin sonuçlarını kelimelere bölmek için IFS kabuk değişkeninin değerini karakter ayırıcıları olarak kullanır.

IFS ayarlanmamışsa, varsayılan olarak boşluk, sekme (tab) ve yeni satır karakterleri ayırıcı olarak kullanılır.

Genişletmenin sonucu hiçbir karakter içermiyorsa, genişletilen kelime tamamen kaldırılır. Genişletme çift tırnaklar içindeyse, sonuçta hiçbir kelime bölme işlemi uygulanmaz ve kelimenin boş değeri korunur.

Dosya Yolu Genişletme (Filename Expansion)

Kelime bölme işleminden sonra, set -f seçeneği etkinleştirilmemişse (aşağıdaki set yerleşik komutuna bakın), bash her bir kelimede *, ? ve [ karakterlerini arar. Bu karakterlerden biri bulunursa, kelime bir desen olarak kabul edilir ve desenle eşleşen dosya adlarının alfabetik olarak sıralanmış bir listesiyle değiştirilir.

Hiçbir eşleşen dosya adı bulunamazsa ve nullglob kabuk seçeneği (shopt yerleşik komutunun açıklamasına bakın) etkin değilse, kelime değişmeden bırakılır. Eğer nullglob etkinse ve eşleşme bulunamazsa, desen tamamen kaldırılır. Eğer failglob etkinse ve eşleşme bulunamazsa, bir hata bildirilir ve kabuk çıkış durumu sıfır dışı döner.

* karakteri, boş dizgi dahil her türlü karakter dizisiyle eşleşir. ? karakteri ise tek bir karakterle eşleşir. [ karakteri ile başlayan desenler ise küme parantezleri içindeki karakterlerden herhangi biriyle eşleşen bir karakter sınıfını belirtir. Karakter sınıfı içinde - karakteri iki karakter arasındaki aralığı belirtir. İlk karakter ! veya ^ ise, kümede bulunmayan karakterlerle eşleşir.

Bash, shopt yerleşik komutunun nocaseglob seçeneği etkinse, dosya adlarını desenle büyük/küçük harf duyarsız olarak eşleştirir.

. ile başlayan dosya adlarının eşleşebilmesi için, desenin ilk karakterinin açıkça bir . olması gerekir, unless shopt yerleşik komutunun dotglob seçeneği etkinleştirilmişse.

Desen Eşleştirme (Pattern Matching)

Karakter sınıfı [ içindeki karakterlerin eşleşmesi, geçerli yerel ayarın karakter sıralamasına (collation sequence) göre gerçekleştirilir.

shopt yerleşik komutunun extglob seçeneği etkinleştirilirse, kabuk tarafından genişletilmiş desen eşleştirme işleçleri tanınır. Bu işleçlerin biçimi şöyledir:

  • ?(desen-listesi): Belirtilen desenlerin sıfır veya bir geçişiyle eşleşir.
  • *(desen-listesi): Belirtilen desenlerin sıfır veya daha fazla geçişiyle eşleşir.
  • +(desen-listesi): Belirtilen desenlerin bir veya daha fazla geçişiyle eşleşir.
  • @(desen-listesi): Belirtilen desenlerden tam olarak biriyle eşleşir.
  • !(desen-listesi): Belirtilen desenlerin hiçbiriyle eşleşmeyen dizgilerle eşleşcekti.

desen-listesi içindeki desenler | karakteriyle ayrılır.

Tırnak Temizleme

Yukarıdaki genişletmelerden sonra, yukarıdaki genişletmelerin birinden kaynaklanmayan, tırnak içine alınmamış tüm `, ' ve " karakterleri kaldırılır.

Yönlendirme

Bir komut yürütülmeden önce, girdisi ve çıktısı kabuk tarafından yorumlanan özel bir gösterim kullanılarak yönlendirilebilir. Yönlendirme, kabuk ortamındaki dosya adlarının ilişkilendirilmesine ve komutların girdi/çıktı akışlarının yeniden yapılandırılmasına olanak tanır. Yönlendirme işleçleri, basit bir komutun herhangi bir yerinde görünebilir veya bir komuttan önce veya sonra gelebilir. Yönlendirmeler göründükleri sırayla, soldan sağa doğru değerlendirilir.

Aşağıdaki açıklamalarda, bir yönlendirme işlecinin önünde bir rakam varsa ve bu rakam tırnak içine alınmamışsa, bu yönlendirme o rakamla belirtilen dosya tanımlayıcısı (file descriptor) üzerinde işlem yapar. Aksi takdirde, işlemin yapılacağı varsayılan dosya tanımlayıcıları şöyledir:

  • Girdi yönlendirmesi için 0 (standart girdi, stdin)
  • Çıktı yönlendirmesi için 1 (standart çıktı, stdout)

İşlecin arkasındaki sözcük, tırnak temizleme (quote removal) dışındaki diğer genişletmelere tabi tutulur. Eğer genişletme sonucunda birden fazla sözcük üretilirse, bash bir yönlendirme hatası bildirir.

Dosya tanımlayıcılarının kabuk tarafından otomatik olarak yönetilmesini sağlamak amacıyla, yönlendirme işleçlerinin önünde {ad} biçiminde bir tanımlayıcı kullanılabilir. Bu durumda, yönlendirme başarılı olduğunda, açılan dosya tanımlayıcısının değeri ad kabuk değişkenine atanır. Eğer yönlendirme işleci önünde {ad} içeriyorsa ve girdi yönlendirmesi yapılıyorsa, ad değişkeninin değeri kapatılacak dosya tanımlayıcısı olarak yorumlanır.

Yönlendirme başarılı olmazsa, komut sıfır olmayan bir çıkış durumuyla sonlandırılır.

Yönlendirmelerin komut satırında değişken atamalarından önce gelmesi gerektiğini unutmayın.

Girdi Yönlendirmesi (Redirecting Input)

Girdi yönlendirmesi, sözcük ile belirtilen dosyanın içeriğinin standart girdiden (dosya tanımlayıcısı 0) okunmasını sağlar.

Girdi yönlendirmesinin biçimi şöyledir:

[n]<sözcük

Eğer n belirtilmemişse, standart girdi (dosya tanımlayıcısı 0) yönlendirilir.

Çıktı Yönlendirmesi (Redirecting Output)

Çıktı yönlendirmesi, standart çıktının (dosya tanımlayıcısı 1) sözcük ile belirtilen dosyaya yazılmasını sağlar.

Çıktı yönlendirmesinin biçimi şöyledir:

[n]>sözcük

Eğer n belirtilmemişse, standart çıktı (dosya tanımlayıcısı 1) yönlendirilir.

Eğer dosya mevcut değilse oluşturulur. Eğer dosya mevcutsa ve noclobber kabuk seçeneği (shopt yerleşik komutunun açıklamasına bakın) etkin değilse, dosyanın üzerine yazılır (içeriği silinir). Eğer noclobber etkinse ve dosya mevcutsa, yönlendirme başarısız olur, unless yönlendirme işleci olarak >| kullanılmışsa (bu, noclobber seçeneğini geçersiz kılar).

Eklemeli Çıktı Yönlendirmesi (Appending Redirected Output)

Eklemeli çıktı yönlendirmesi, standart çıktının (dosya tanımlayıcısı 1) sözcük ile belirtilen dosyanın sonuna eklenmesini sağlar.

Yönlendirmenin biçimi şöyledir:

[n]>>sözcük

Eğer n belirtilmemişse, standart çıktı (dosya tanımlayıcısı 1) yönlendirilir. Eğer dosya mevcut değilse oluşturulur.

Standart Çıktı ve Standart Hatanın Birlikte Yönlendirmesi

Bu yönlendirme biçimi, hem standart çıktının (dosya tanımlayıcısı 1) hem de standart hatanın (dosya tanımlayıcısı 2) sözcük ile belirtilen dosyaya yönlendirilmesini sağlar.

İki farklı biçimi vardır:

&>sözcük

ve:

>&sözcük

Bu iki biçimden ilki tercih edilir. Her iki biçim de tam olarak şu yönlendirmeyle eşdeğerdir:

>sözcük 2>&1

Burada Belge Yönlendirmesi (Here Documents)

Bu yönlendirme biçimi, kabuğun girdi akışını, komutun standart girdisine yönlendirmesini sağlar. Girdi akışı, tam olarak eşleşen bir sınır kelimesi (delimiter) içeren satıra kadar okunur. Sınır kelimesini içeren satırdan önceki tüm satırlar komutun standart girdisi olarak kabul edilir.

Burada belge yönlendirmenin biçimi şöyledir:

[n]<<[-]sınır
        burada-belge-içeriği
sınır

sınır kelimesi üzerinde parametre genişletmesi, komut değiştirme, dosya adı genişletmesi veya aritmetik genişletme gerçekleştirilmez. Eğer sınır kelimesinin herhangi bir karakteri tırnak içine alınmışsa, sınır kelimesindeki tırnaklar kaldırılır ve burada-belge-içeriği içindeki satırlar üzerinde hiçbir genişletme uygulanmaz. Aksi takdirde, burada-belge-içeriği içindeki tüm satırlar parametre genişletmesi, komut değiştirme ve aritmetik genişletmeye tabi tutulur. Bu durumda, ters eğik çizgi karakteri (\) özel anlamını yalnızca \, $, ` ve yeni satır karakterlerinin önünde korur.

Eğer yönlendirme işleci <<- ise, sınır kelimesi dahil olmak üzere burada-belge-içeriği içindeki her satırın başındaki tüm sekme (tab) karakterleri silinir. Bu durum, kabuk betikleri içindeki burada belgelerinin daha okunaklı şekilde girintilenmesini sağlar.

Burada Dize Yönlendirmesi (Here Strings)

Burada belge yönlendirmesinin daha basit bir biçimidir. Sözcük genişletilir ve standart girdiden okunacak tek bir satır olarak komuta sunulur.

Yönlendirmenin biçimi şöyledir:

[n]<<<sözcük

Eğer n belirtilmemişse, standart girdi (dosya tanımlayıcısı 0) yönlendirilir.

Dosya Tanımlayıcılarının Kopyalanması (Duplicating File Descriptors)

Girdi ve çıktı dosya tanımlayıcılarının kopyalanması için aşağıdaki yönlendirme biçimleri kullanılır.

Girdi dosya tanımlayıcısını kopyalamak için:

[n]<&sözcük

Burada, sözcük bir sayıya genişletilirse, n ile belirtilen dosya tanımlayıcısı, sözcük ile belirtilen dosya tanımlayıcısının bir kopyası haline gelir. Eğer sözcük içindeki sayı bir dosya tanımlayıcısını belirtmiyorsa, yönlendirme hatası oluşur. Eğer sözcük - karakterine genişletilirse, n ile belirtilen dosya tanımlayıcısı kapatılır. Eğer n belirtilmemişse, standart girdi (dosya tanımlayıcısı 0) kullanılır.

Çıktı dosya tanımlayıcısını kopyalamak için:

[n]>&sözcük

Burada, sözcük bir sayıya genişletilirse, n ile belirtilen dosya tanımlayıcısı, sözcük ile belirtilen dosya tanımlayıcısının bir kopyası haline gelir. Eğer sözcük - karakterine genişletilirse, n ile belirtilen dosya tanımlayıcısı kapatılır. Eğer n belirtilmemişse, standart çıktı (dosya tanımlayıcısı 1) kullanılır.

Dosya Tanımlayıcılarının Taşınması (Moving File Descriptors)

Girdi ve çıktı dosya tanımlayıcılarının taşınması için aşağıdaki yönlendirme biçimleri kullanılır.

Girdi dosya tanımlayıcısını taşımak için:

[n]<&dijit-

Burada, dijit ile belirtilen dosya tanımlayıcısı n dosya tanımlayıcısına taşınır ve ardından dijit kapatılır. n belirtilmemişse standart girdi (0) kullanılır.

Çıktı dosya tanımlayıcısını taşımak için:

[n]>&dijit-

Burada, dijit ile belirtilen dosya tanımlayıcısı n dosya tanımlayıcısına taşınır ve ardından dijit kapatılır. n belirtilmemişse standart çıktı (1) kullanılır.

Okuma ve Yazma İçin Açma (Opening File Descriptors for Reading and Writing)

Bu yönlendirme biçimi, sözcük ile belirtilen dosyanın hem okuma hem de yazma amacıyla açılmasını sağlar.

Yönlendirmenin biçimi şöyledir:

[n]<>sözcük

Eğer n belirtilmemişse, standart girdi (dosya tanımlayıcısı 0) yönlendirilir. Eğer dosya mevcut değilse oluşturulur.

RUMUZLAR (Aliases)

Rumuzlar (Aliases), bir sözcüğün bir basit komutun ilk sözcüğü olarak kullanıldığında başka bir metinle değiştirilmesini sağlar. Kabuk, tanımlanmış rumuzların bir listesini tutar. Bu liste alias yerleşik komutuyla oluşturulur ve değiştirilir, unalias yerleşik komutuyla ise rumuzlar kaldırılır (aşağıdaki KABUK YERLEŞİK KOMUTLARI bölümüne bakın).

Her basit komutun ilk sözcüğü, tırnak içine alınmamışsa, bir rumuz olup olmadığı kontrol edilir. Sözcük bir rumuz ise, o sözcük rumuzun tanımlandığı değerle değiştirilir. Rumuzun değerindeki ilk karakterler kabuk ayrılmış sözcükleri (reserved words) ve meta karakterler hariç olmak üzere, geçerli bir basit komut adı oluşturabilir. Rumuz adında /, $, ` veya = karakterleri ve denetim işleçleri bulunamaz. Rumuz değeri, genişletmeler de dahil olmak üzere her türlü kabuk girdisini içerebilir.

Eğer rumuz değerinin son karakteri bir boşluk veya sekme ise, rumuzdan sonraki bir sonraki komut sözcüğü de rumuz genişletmesi için kontrol edilir.

Rumuzlar, alias komutuyla oluşturulduğu andan itibaren geçerlidir. Ancak, komut satırı okunup ayrıştırıldıktan sonra yürütüldüğü için, aynı satır üzerindeki bir rumuz tanımı hemen ardından gelen komutlarda etkili olmaz. Örneğin:

alias l='ls -l' ; l

komut dizisinde l bir rumuz olarak genişletilmez; çünkü satır okunurken henüz l rumuzu tanımlanmamıştır. Bu durum ancak bir sonraki komut satırında etkili olur.

Kabuk fonksiyonları, rumuzların yerini büyük ölçüde almıştır; çünkü fonksiyonlar daha esnek ve karmaşık mantıkları yürütmede daha yeteneklidir.

Etkileşimli olmayan kabuklarda, rumuz genişletmesi varsayılan olarak devre dışıdır, unless shopt yerleşik komutu kullanılarak expand_aliases kabuk seçeneği etkinleştirilmişse (aşağıdaki KABUK YERLEŞİK KOMUTLARI altındaki shopt açıklamasına bakın).

Rumuzların tanımlanması ve kullanımıyla ilgili kurallar hakkında ayrıntılı bilgi için alias yerleşik komutunun açıklamasına bakın.

Parametreler (Parameters)

Bir parametre, değer depolayan bir nesnedir. Bir ad (name), bir sayı veya aşağıda Özel Parametreler altında listelenen özel karakterlerden biri olabilir. Kabuk değişkeni (variable), bir ad ile temsil edilen parametredir. Değişkenlerin declare yerleşik komutu kullanılarak atanabilen öznitelikleri (tamsayı, dizi vb.) olabilir (aşağıdaki KABUK YERLEŞİK KOMUTLARI altındaki declare açıklamasına bakın).

Bir parametre ayarlanmışsa (set), ona bir değer atanmıştır. Boş dizgi ("") geçerli bir değerdir. Bir değişken bir kez ayarlandıktan sonra, yalnızca unset yerleşik komutu kullanılarak silinebilir (unset) (aşağıdaki KABUK YERLEŞİK KOMUTLARI açıklamasına bakın).

Değişkenler şu biçimdeki bir ifadeyle atanabilir:

ad=[değer]

Eğer değer belirtilmemişse, değişkene boş dizgi atanır. Tüm değerler tilde genişletmesi, parametre ve değişken genişletmesi, komut değiştirme, aritmetik genişletme ve tırnak temizliğine tabi tutulur (yukarıdaki GENİŞLETME bölümüne bakın). Değişkenin declare kullanılarak tamsayı özniteliği ayarlanmışsa (-i), değer aritmetik ifade olarak değerlendirilir (aşağıdaki ARİTMETİK DEĞERLENDİRME bölümüne bakın). Dizi değişkenleri için bileşik atama (compound assignment) söz dizimi kullanılabilir (aşağıdaki Diziler bölümüne bakın).

Konumsal Parametreler (Positional Parameters)

Bir konumsal parametre (positional parameter), sıfır hariç bir veya daha fazla basamaklı bir sayı ile temsil edilen parametredir. Konumsal parametreler, kabuk başlatıldığında kabuğa aktarılan argümanlarla atanır ve shift yerleşik komutu kullanılarak yeniden atanabilir veya kaydırılabilir. Konumsal parametreler değişken atama ifadeleriyle doğrudan atanamaz; bunların yerine set and shift yerleşik komutları kullanılmalıdır (aşağıdaki KABUK YERLEŞİK KOMUTLARI bölümüne bakın). Konumsal parametreler bir fonksiyon yürütülürken geçici olarak değiştirilir (yukarıdaki Kabuk Fonksiyonları bölümüne bakın).

Bir konumsal parametre 9'dan büyük bir sayıyla belirtildiğinde, parametre genişletilirken küme parantezleri içine alınmalıdır (yukarıdaki GENİŞLETME altındaki Parametre Genişletmesi bölümüne bakın).

Özel Parametreler (Special Parameters)

Kabuk, çeşitli özel parametreleri otomatik olarak tanımlar ve yönetir. Bu parametreler salt okunurdur (readonly); değerleri doğrudan değiştirilemez.

  • *: 1'den başlayarak tüm konumsal parametrelere genişletilir. Genişletme çift tırnaklar içinde bulunuyorsa ("$*"), her bir konumsal parametre IFS özel değişkeninin ilk karakteriyle ayrılmış tek bir kelime olarak genişletilir. IFS ayarlanmamışsa, parametreler boşlukla ayrılır. IFS boş dizgi ise, parametreler aralarında hiçbir ayırıcı olmadan birleştirilir.
  • @: 1'den başlayarak tüm konumsal parametrelere genişletilir. Genişletme çift tırnaklar içinde bulunuyorsa ("$@"), her bir konumsal parametre ayrı bir kelime olarak genişletilir. Konumsal parametre yoksa, "$@" hiçbir şeye genişletilmez (kaldırılır).
  • #: Konumsal parametrelerin sayısına genişletilir.
  • ?: En son yürütülen ön plan boru hattının çıkış durumuna genişletilir.
  • -: set yerleşik komutuyla veya kabuk tarafından otomatik olarak ayarlanan geçerli kabuk seçeneklerinin harf kodlarına (örn. hB) genişletilir.
  • $: Kabuğun süreç kimliğine (PID) genişletilir. Bir alt kabukta (subshell), alt kabuğun değil, çağıran ana kabuğun süreç kimliğine genişletilir.
  • !: En son arka plana gönderilen (arka plan süreci olarak çalıştırılan) komutun süreç kimliğine (PID) genişletilir.
  • 0: Kabuğun veya kabuk betiğinin adına genişletilir. Bu değer kabuk başlatılırken sıfırıncı argüman olarak belirlenir. Komutlar bir dosyadan okunuyorsa (bash dosya), değer o dosyanın adıdır. Bash -c seçeneğiyle başlatılmışsa, değer yürütülecek dizgiden sonra gelen ilk argümandır (varsa).
  • _: Kabuk başlatıldığında, yürütülen kabuğun veya kabuk betiğinin tam dosya yoluna genişletilir. Ardından, her komutun yürütülmesinden sonra, o komutun son argümanına genişletilir. Ayrıca, yürütülen her komut için ortama aktarılan tam dosya yoluna ayarlanır.

Kabuk Değişkenleri (Shell Variables)

Kabuk tarafından otomatik olarak tanımlanan veya özel anlamı olan değişkenler şunlardır:

  • BASH: Bu bash örneğini yürütmek için kullanılan tam dosya adına genişletilir.
  • BASH_ARGC: Geçerli kabuk çağrı yığınındaki her bir çerçevenin (frame) argüman sayısını içeren dizi değişkenidir. Yalnızca genişletilmiş hata ayıklama modunda kullanılabilir (shopt yerleşik komutunun extdebug seçeneğine bakın).
  • BASH_ARGV: Geçerli kabuk çağrı yığınındaki tüm argümanları içeren dizi değişkenidir. Yalnızca genişletilmiş hata ayıklama modunda kullanılabilir.
  • BASH_COMMAND: O anda yürütülmekte olan veya yürütülmek üzere olan komutun metnine genişletilir. Bir trap yürütülürken, trap'in tetiklenmesine neden olan komutun adıdır.
  • BASH_EXECUTION_STRING: -c komut satırı seçeneği ile başlatılan bash örneğinde yürütülen dizgiye genişletilir.
  • BASH_LINENO: Kabuk fonksiyonlarının veya betiklerin çağrıldığı satır numaralarını içeren dizi değişkenidir. ${BASH_LINENO[i]} değeri, ${FUNCNAME[i]} fonksiyonunun çağrıldığı kaynak dosyadaki satır numarasıdır.
  • BASH_REMATCH: Koşullu komut [[ içinde =~ ikili işleciyle gerçekleştirilen düzenli ifade eşleştirmesinin sonuçlarını tutan dizi değişkenidir (yukarıdaki Bileşik Komutlar bölümüne bakın).
  • BASH_SOURCE: ${FUNCNAME} dizisindeki fonksiyonların tanımlandığı kaynak dosya adlarını içeren dizi değişkenidir.
  • BASH_SUBSHELL: Kabuğun yürütüldüğü alt kabuk (subshell) düzeyini belirten tamsayı değerdir. Ana kabukta 0'dır; her yeni alt kabuk oluşturulduğunda 1 artar.
  • BASH_VERSINFO: Bu bash örneği hakkında sürüm bilgilerini içeren salt okunur dizi değişkenidir. Dizinin öğeleri şunlardır:
    • BASH_VERSINFO[0]: Ana sürüm numarası (major version).
    • BASH_VERSINFO[1]: Alt sürüm numarası (minor version).
    • BASH_VERSINFO[2]: Yama düzeyi (patch level).
    • BASH_VERSINFO[3]: Derleme sürümü (build version).
    • BASH_VERSINFO[4]: Yayın durumu (release status, örn. release).
    • BASH_VERSINFO[5]: Makine mimarisi (architecture, örn. x86_64-apple-darwin).
  • BASH_VERSION: Bu bash örneğinin sürüm bilgisini içeren dizgidir (örn. 3.2.57(1)-release).
  • COLUMNS: select yerleşik komutu tarafından menü genişliklerini belirlemek için kullanılan ve checkwinsize seçeneği etkinse otomatik olarak güncellenen terminal sütun genişliğidir.
  • COMP_CWORD: ${COMP_WORDS} dizisindeki, tamamlanmakta olan sözcüğü içeren öğenin indeksidir. Yalnızca programlanabilir tamamama işlevlerinde kullanılabilir (aşağıdaki Programlanabilir Tamamlama bölümüne bakın).
  • COMP_LINE: Geçerli komut satırının tamamını içeren dizgidir. Yalnızca programlanabilir tamamama işlevlerinde kullanılabilir.
  • COMP_POINT: İmlecin geçerli satırın başından itibaren olan karakter konumudur (indeks). Yalnızca programlanabilir tamamama işlevlerinde kullanılabilir.
  • COMP_WORDS: Geçerli komut satırındaki her bir sözcüğü içeren dizi değişkenidir. Yalnızca programlanabilir tamamama işlevlerinde kullanılabilir.
  • COMPREPLY: Programlanabilir bir tamamama fonksiyonunun ürettiği olası tamamlamaları yerleştirdiği dizi değişkenidir.
  • DIRSTACK: Geçerli dizin yığınının (directory stack) içeriğini tutan dizi değişkenidir. Yığındaki dizinler sırasıyla dirs yerleşik komutunun gösterdiği sırayla yer alır. pushd ve popd komutları yığını değiştirir.
  • EUID: Kabuk başlatılırken gerçek kullanıcı kimliğine göre başlatılan, geçerli etkin kullanıcı kimliğini (effective user ID) içeren salt okunur değişkendir.
  • FUNCNAME: Çağrı yığınındaki tüm aktif kabuk fonksiyonlarının adlarını içeren dizi değişkenidir. ${FUNCNAME[0]} o anda yürütülen fonksiyonun adıdır.
  • GROUPS: Geçerli kullanıcının üye olduğu tüm grupların kimliklerini (GID) içeren dizi değişkenidir.
  • HISTCMD: Geçerli komutun geçmiş listesindeki indeksidir (satır numarası).
  • HOSTNAME: Geçerli makinenin ana bilgisayar adını (hostname) içeren dizgidir.
  • HOSTTYPE: Kabuğun üzerinde çalıştığı makine tipini tanımlayan benzersiz dizgidir (örn. x86_64).
  • LINENO: Yürütülmekte olan kabuk betiği veya kabuk fonksiyonu içindeki satır numarasıdır. Bir betik veya fonksiyon dışında 1'den başlar.
  • MACHTYPE: Kabuğun derlendiği GNU standart mimari dizgisidir (örn. x86_64-apple-darwin).
  • OLDPWD: cd yerleşik komutu tarafından ayarlanan bir önceki çalışma dizinidir.
  • OPTARG: getopts yerleşik komutu tarafından işlenen son seçeneğin argüman değeridir (aşağıdaki KABUK YERLEŞİK KOMUTLARI bölümüne bakın).
  • OPTIND: getopts yerleşik komutu tarafından işlenecek bir sonraki argümanın indeksidir.
  • OSTYPE: Kabuğun derlendiği işletim sistemini tanımlayan dizgidir (örn. darwin).
  • PIPESTATUS: En son yürütülen ön plan boru hattındaki (pipeline) her bir komutun çıkış durumunu içeren dizi değişkenidir. ${PIPESTATUS[i]} boru hattındaki i. komutun çıkış durumudur.
  • PPID: Kabuğun ana sürecinin (parent process) süreç kimliğidir (PID).
  • PWD: cd yerleşik komutu tarafından ayarlanan geçerli çalışma dizinidir.
  • RANDOM: Her başvurulduğunda 0 ile 32767 arasında rastgele bir tamsayı üreten değişkendir. RANDOM değişkenine bir değer atanarak rastgele sayı üretecinin başlangıç değeri (seed) belirlenebilir.
  • REPLY: read yerleşik komutu argümansız olarak çağrıldığında okunan satırı alan değişkendir. Ayrıca select yerleşik komutunda kullanıcının girdisini tutar.
  • SECONDS: Kabuk başlatıldığından beri geçen süreyi saniye cinsinden tutan değişkendir. SECONDS değişkenine bir değer atanarak sayaç o değerden itibaren yeniden başlatılabilir.
  • SHELLOPTS: Etkin kabuk seçeneklerinin virgülle ayrılmış bir listesini içeren salt okunur değişkenidir. Bu değişken ortamda mevcutsa, bash başlatılırken belirtilen seçenekleri etkinleştirir.
  • SHLVL: Her yeni bash örneği başlatıldığında 1 artan, kabuk kabuk iç içe geçme düzeyini (shell level) belirten tamsayıdır.
  • UID: Geçerli kullanıcının gerçek kullanıcı kimliğini (user ID) içeren salt okunur değişkendir.
  • BASH_ENV: Bash etkileşimsiz olarak başlatıldığında bu değişken ayarlanmışsa, değeri genişletilerek okunup yürütülecek bir başlatma dosyasının adı olarak kullanılır (yukarıdaki BAŞLATMA bölümüne bakın).
  • CDPATH: cd yerleşik komutu için arama dizinlerini içeren, iki nokta üst üste (:) ile ayrılmış dizin yolları listesidir (örn. .:~:/usr).
  • FCEDIT: fc yerleşik komutu için varsayılan düzenleyici programının adıdır.
  • FIGNORE: Dosya adı tamamlaması yapılırken yok sayılacak son eklerin (suffix) iki nokta üst üste ile ayrılmış listesidir (örn. .o:~).
  • GLOBIGNORE: Dosya yolu genişletmesi (globbing) tarafından yok sayılacak dosya adı desenlerinin iki nokta üst üste ile ayrılmış listesidir.
  • HISTCONTROL: Komutların geçmiş listesine (history list) nasıl kaydedileceğini kontrol eden, üst üste iki nokta ile ayrılmış değerler listesidir. Değerler şunlar olabilir:
    • ignorespace: Boşlukla başlayan satırlar geçmişe kaydedilmez.
    • ignoredups: Önceki satırla birebir aynı olan komutlar geçmişe kaydedilmez.
    • ignoreboth: Hem ignorespace hem de ignoredups kurallarını uygular.
    • erasedups: Geçerli komut kaydedilmeden önce geçmişteki tüm eşleşen kopyaları silinir.
  • HISTFILE: Komut geçmişinin kaydedileceği dosyanın adıdır (varsayılan: ~/.bash_history).
  • HISTFILESIZE: Komut geçmişi dosyasında saklanacak maksimum satır sayısıdır (varsayılan: 500).
  • HISTIGNORE: Hangi komutların geçmiş listesine kaydedilmeyeceğini belirleyen, iki nokta üst üste ile ayrılmış desenler listesidir.
  • HISTSIZE: Geçerli oturumda geçmiş listesinde saklanacak maksimum komut sayısıdır (varsayılan: 500).
  • HOME: cd yerleşik komutu için varsayılan argüman olan ve tilde genişletmesinde kullanılan geçerli kullanıcının ev dizinidir.
  • HOSTFILE: select veya tamamlama işlevleri sırasında ana bilgisayar adlarının (hostname) tamamlanması için okunacak dosyanın adıdır (biçim: /etc/hosts ile aynı).
  • IFS: Kabuk tarafından kelime bölme (word splitting) ve yönlendirmelerde sözcükleri bölmek amacıyla kullanılan dahili alan ayırıcı karakterleridir (Internal Field Separator). Varsayılan değer: boşluk, sekme ve yeni satır.
  • IGNOREEOF: Etkileşimli bir kabukta tek başına girilen dosya sonu (EOF, Ctrl+D) karakterinin kabuktan çıkmasına izin verilmeden önce kaç kez yok sayılacağını belirleyen tamsayıdır. Değişken ayarlanmışsa ancak bir değer atanmamışsa varsayılan değer 10'dur.
  • INPUTRC: Readline kütüphanesi için başlatma dosyasının adıdır (varsayılan: ~/.inputrc).
  • LANG: Sistem yerel ayarını (locale) belirleyen varsayılan değişkendir. LC_ ile başlayan diğer yerel ayar değişkenleri LANG değerini geçersiz kılabilir.
  • LC_ALL: Tüm yerel ayar kategorilerini tek seferde geçersiz kılan en öncelikli yerel ayar değişkenidir.
  • LC_COLLATE: Dosya adı globbing ve case desen eşleştirmelerinde alfabetik sıralama sırasını (collation order) belirler.
  • LC_CTYPE: Karakterlerin nasıl yorumlanacağını ve karakter sınıflarını (harf, rakam vb.) belirler.
  • LC_MESSAGES: Çift tırnak önünde $ işareti bulunan dizgilerin çevrileceği dil yerel ayarını belirler.
  • LC_NUMERIC: Sayısal biçimlendirme ve ondalık ayırıcıyı belirler.
  • MAIL: Kullanıcıya yeni posta gelip gelmediğinin kontrol edileceği posta dosyasının adıdır.
  • MAILPATH: Yeni posta kontrolü yapılacak posta dosyalarının iki nokta üst üste ile ayrılmış listesidir. Posta dosyası yollarından sonra gelen ? karakterinden sonra bir bildirim mesajı belirtilebilir (örn. /var/mail/user?"Yeni posta geldi!").
  • MAILCHECK: Kabuğun yeni posta kontrolünü kaç saniyede bir yapacağını belirleyen tamsayıdır (varsayılan: 60 saniye). Değer 0 ise her istemden (prompt) önce kontrol yapılır.
  • OPTERR: getopts yerleşik komutu tarafından üretilen hata mesajlarının standart hataya yazdırılıp yazdırılmayacağını belirleyen değerdir (1 ise hata mesajları yazdırılır, varsayılan: 1).
  • PATH: Komutların aranacağı dizin yollarının iki nokta üst üste ile ayrılmış listesidir (örn. /usr/bin:/bin:/usr/sbin:/sbin).
  • POSIXLY_CORRECT: Bu değişken ortamda mevcutsa, bash başlatılırken posix moduna girer. Kabuk çalışırken bu değişkene bir değer atanırsa bash yine posix moduna geçer.
  • PROMPT_COMMAND: Etkileşimli kabukta her PS1 birincil istemi görüntülenmeden önce yürütülecek komuttur.
  • PS1: Etkileşimli kabuğun birincil istem dizgisidir (prompt). Varsayılan değer: \s-\v\$ . İçerdiği kaçış karakterleri (escape sequences) hakkında bilgi için aşağıdaki İSTEMLER (PROMPTING) bölümüne bakın.
  • PS2: Çok satırlı komutlar girilirken veya ek girdi beklenirken görüntülenen ikincil istem dizgisidir. Varsayılan değer: > .
  • PS3: select yerleşik komutunda seçenekler listelendikten sonra görüntülenen istem dizgisidir. Varsayılan değer: #? .
  • PS4: set yerleşik komutuyla yürütme takibi (-x) etkinleştirildiğinde her komut satırının önünde görüntülenen istem dizgisidir. Varsayılan değer: + .
  • SHELL: Kabuğun tam dosya yolunu içeren değişkendir.
  • TIMEFORMAT: Boru hatlarının başında time ayrılmış sözcüğü kullanıldığında süre raporunun biçimini belirleyen dizgidir (örn. real %3R\nuser %3U\nsys %3S).
  • TMOUT: Etkileşimli kabukta, bu saniye kadar girdi beklenirse ve hiçbir şey girilmezse kabuğun otomatik olarak çıkmasını sağlayan tamsayıdır. read yerleşik komutu için de varsayılan zaman aşımı süresini belirler.
  • TMPDIR: Geçici dosyaların oluşturulacağı varsayılan dizindir.
  • auto_resume: Kabuğun iş denetimi (job control) sırasında durdurulmuş işleri nasıl otomatik olarak sürdüreceğini kontrol eden değişkendir (değerler: exact, substring, substring vb.).

Diziler (Arrays)

Bash, tek boyutlu dizinlenmiş (indexed) ve ilişkisel (associative) dizi değişkenlerini destekler. Herhangi bir değişken declare yerleşik komutu kullanılarak dizi haline getirilebilir. declare -a dizinlenmiş dizileri, declare -A ise ilişkisel dizileri tanımlar. Değişkenlerin dizi olarak tanımlanması için declare kullanımı zorunlu değildir, unless ilişkisel diziler tanımlanıyorsa (ilişkisel diziler her zaman declare -A ile tanımlanmalıdır).

Dizinlenmiş dizilerde indisler (indeksler) negatif olmayan tamsayılardır. İlişkisel dizilerde ise indisler rastgele dizgilerdir.

Dizi öğelerine şu söz dizimiyle değer atanabilir:

ad[indis]=değer

Burada indis, dizinlenmiş dizilerde bir aritmetik ifade olmalıdır ve bu ifade sıfır veya daha büyük bir tamsayıya değerlendirilmelidir. Dizi atamalarında bileşik atama (compound assignment) biçimi kullanılabilir:

ad=(öğe1 öğe2 ...)

Dizinlenmiş dizilerde, bileşik atama içinde indisler açıkça belirtilebilir:

ad=([0]=değer1 [1]=değer2 ...)

İlişkisel dizilerde bileşik atamalarda indislerin belirtilmesi zorunludur:

ad=([anahtar1]=değer1 [anahtar2]=değer2 ...)

Bir dizi değişkenini tamamen silmek için unset ad komutu kullanılır. Dizinin belirli bir öğesini silmek için unset ad[indis] kullanılır.

Dizi öğelerine başvururken ${ad[indis]} söz dizimi kullanılır. Küme parantezleri zorunludur. indis yerine * veya @ kullanılması, dizinin atanmış tüm öğelerine genişletilir. "${ad[@]}" çift tırnak içinde kullanıldığında, her bir dizi öğesi ayrı bir kelime olarak genişletilir. ${#ad[indis]} o dizi öğesinin değerinin karakter uzunluğuna genişletilir. ${#ad[*]} veya ${#ad[@]} dizideki atanmış öğelerin toplam sayısına genişletilir. ${!ad[@]} dizideki atanmış indislerin (indeks veya anahtarların) listesine genişletilir.

Aritmetik Değerlendirme (Arithmetic Evaluation)

Kabuk, belirli durumlarda aritmetik ifadelerin değerlendirilmesine izin verir (bkz. let ve declare yerleşik komutları ile (( )) aritmetik bileşik komutu). Değerlendirme, uzun tamsayılar (long integers) üzerinde gerçekleştirilir ve taşma kontrolleri uygulanmaz. Ancak 0 ile bölme işlemi hata olarak kabul edilir ve kabuk çıkış durumu sıfır dışı döner.

Aritmetik ifadelerde işleçler ve öncelikleri, C dilindeki öncelik kurallarına çok benzer. İşleçler (azalan öncelik sırasına göre) şunlardır:

  • id++ id--: Değişken sonradan artırma (post-increment) ve sonradan azaltma (post-decrement).
  • ++id --id: Değişken önceden artırma (pre-increment) ve önceden azaltma (pre-decrement).
  • - +: Tekli eksi (unary minus) ve tekli artı (unary plus).
  • ! ~: Mantıksal ve bit düzeyinde olumsuzlama (logical and bitwise negation).
  • **: Üs alma (exponentiation).
  • * / %: Çarpma, bölme ve kalan (modül).
  • + -: Toplama ve çıkarma.
  • << >>: Bit düzeyinde sola ve sağa kaydırma.
  • <= >= < >: Karşılaştırma işleçleri.
  • == !=: Eşitlik ve eşitsizlik işleçleri.
  • &: Bit düzeyinde VE (bitwise AND).
  • ^: Bit düzeyinde özel VEYA (bitwise XOR).
  • |: Bit düzeyinde VEYA (bitwise OR).
  • &&: Mantıksal VE (logical AND).
  • ||: Mantıksal VEYA (logical OR).
  • expr?expr:expr: Koşullu (üçlü) işleç (conditional operator).
  • = *= /= %= += -= <<= >>= &= ^= |=: Atama işleçleri.
  • expr1 , expr2: Virgül işleci (sıralı değerlendirme).

Aritmetik ifadelerde kabuk değişkenleri parametre genişletme söz dizimi kullanılmadan doğrudan adlarıyla kullanılabilir (örn. val yerine $val yazılması zorunlu değildir). Değişken boş veya ayarlanmamışsa, değeri 0 olarak kabul edilir. Değişkenlerin değerleri aritmetik ifadenin değerlendirilmesinden önce parametre genişletmesine tabi tutulur.

Tamsayı sabitleri 0 ile başlıyorsa sekizlik (octal) sayı tabanında, 0x veya 0X ile başlıyorsa onaltılık (hexadecimal) sayı tabanında kabul edilir. Diğer sabitler ise [taban#]n biçiminde girilebilir; burada taban 2 ile 64 arasında bir sayı tabanını belirtir. n ise bu tabandaki sayı değeridir. taban belirtilmemişse 10'luk taban varsayılır. 36'dan büyük tabanlarda 10'luk tabandaki 10-35 sayı değerleri için küçük harfler, 36-61 sayı değerleri için büyük harfler, 62 için @, 63 için _ karakterleri kullanılır.

Koşullu İfadeler (Conditional Expressions)

Koşullu ifadeler, dosya özniteliklerini test etmek ve dizgi ve aritmetik karşılaştırmalar yapmak amacıyla [[ bileşik komutu ile test ve [ yerleşik komutları tarafından kullanılır.

İfadeler, aşağıdaki tekli (unary) veya ikili (binary) birincillerden oluşur:

  • -a dosya: dosya mevcutsa doğrudur.
  • -b dosya: dosya mevcutsa ve bir blok özel dosyası (block special file) ise doğrudur.
  • -c dosya: dosya mevcutsa ve bir karakter özel dosyası (character special file) ise doğrudur.
  • -d dosya: dosya mevcutsa ve bir dizin (directory) ise doğrudur.
  • -e dosya: dosya mevcutsa doğrudur.
  • -f dosya: dosya mevcutsa ve normal bir dosya (regular file) ise doğrudur.
  • -g dosya: dosya mevcutsa ve set-group-id (sgid) özniteliği ayarlanmışsa doğrudur.
  • -h dosya: dosya mevcutsa ve bir sembolik bağ (symbolic link) ise doğrudur.
  • -k dosya: dosya mevcutsa ve "sticky" biti ayarlanmışsa doğrudur.
  • -p dosya: dosya mevcutsa ve adlandırılmış bir boru (FIFO) ise doğrudur.
  • -r dosya: dosya mevcutsa ve okunabilir (readable) ise doğrudur.
  • -s dosya: dosya mevcutsa ve boyutu sıfırdan büyükse doğrudur.
  • -t fd: fd dosya tanımlayıcısı açık ise ve bir terminale bağlı ise doğrudur.
  • -u dosya: dosya mevcutsa ve set-user-id (suid) özniteliği ayarlanmışsa doğrudur.
  • -w dosya: dosya mevcutsa ve yazılabilir (writable) ise doğrudur.
  • -x dosya: dosya mevcutsa ve yürütülebilir/aranabilir (executable/searchable) ise doğrudur.
  • -O dosya: dosya mevcutsa ve sahibi etkin kullanıcı kimliğine (effective user ID) eşitse doğrudur.
  • -G dosya: dosya mevcutsa ve sahibi etkin grup kimliğine (effective group ID) eşitse doğrudur.
  • -L dosya: dosya mevcutsa ve bir sembolik bağ (symbolic link) ise doğrudur.
  • -S dosya: dosya mevcutsa ve bir soket (socket) ise doğrudur.
  • -N dosya: dosya mevcutsa ve en son okunduğundan beri değiştirilmişse doğrudur.
  • dosya1 -nt dosya2: dosya1, dosya2'den daha yeni ise (değiştirilme zamanına göre) veya dosya1 mevcut olup dosya2 mevcut değilse doğrudur.
  • dosya1 -ot dosya2: dosya1, dosya2'den daha eski ise veya dosya2 mevcut olup dosya1 mevcut değilse doğrudur.
  • dosya1 -ef dosya2: dosya1 ve dosya2 aynı cihaz ve inod numaralarına sahipse (aynı dosyaya işaret eden sabit bağlar ise) doğrudur.
  • -o optname: optname kabuk seçeneği etkinse doğrudur (bkz. set -o).
  • -z dizgi: dizgi'nin uzunluğu sıfır ise doğrudur.
  • -n dizgi / dizgi: dizgi'nin uzunluğu sıfırdan büyükse doğrudur.
  • dizgi1 == dizgi2 / dizgi1 = dizgi2: Dizgiler eşitse doğrudur. = işleci POSIX standartlarına uyum için == ile eşdeğer olarak kullanılabilir.
  • dizgi1 != dizgi2: Dizgiler eşit değilse doğrudur.
  • dizgi1 < dizgi2: dizgi1, geçerli yerel ayarın karakter sıralamasına göre alfabetik olarak dizgi2'den önce geliyorsa doğrudur.
  • dizgi1 > dizgi2: dizgi1, geçerli yerel ayarın karakter sıralamasına göre alfabetik olarak dizgi2'den sonra geliyorsa doğrudur.
  • arg1 -eq arg2 / arg1 -ne arg2 / arg1 -lt arg2 / arg1 -le arg2 / arg1 -gt arg2 / arg1 -ge arg2: Bu aritmetik ikili karşılaştırma işleçleri, sırasıyla eşit, eşit değil, küçük, küçük veya eşit, büyük, büyük veya eşit durumlarında doğru döndürür. arg1 ve arg2 geçerli aritmetik ifadeler olmalıdır (bkz. ARİTMETİK DEĞERLENDİRME).

Komut Yürütme (Command Execution)

Kabuk, bir komutu yürütmeden önce satırı sözcüklerine ayırır, genişletmeleri gerçekleştirir ve yönlendirmeleri uygular.

Komut adı herhangi bir eğik çizgi (/) içermiyorsa, kabuk sırasıyla şunları kontrol eder:

  1. Kabuk Fonksiyonları: Komut adıyla eşleşen bir fonksiyon tanımlanmışsa, bu fonksiyon yürütülür (yukarıdaki Kabuk Fonksiyonları bölümüne bakın).
  2. Kabuk Yerleşik Komutları: Komut adıyla eşleşen bir yerleşik komut varsa, o yerleşik komut yürütülür.
  3. Harici Komutlar: Komut adı PATH değişkeninde belirtilen dizinlerde aranır. PATH içindeki dizinler soldan sağa aranır. Eşleşen yürütülebilir bir dosya bulunduğunda, o dosya yeni bir süreçte (alt kabukta) yürütülür.

Eğer komut adı bir eğik çizgi içeriyorsa (örn. ./betik veya /bin/ls), kabuk doğrudan belirtilen dosya yolunu yürütür; PATH araması yapılmaz.

Harici bir komut yürütülürken, dosya bir ikili yürütülebilir dosya (binary executable) ise doğrudan sistem tarafından çalıştırılır. Dosya bir metin dosyası ise ve ilk satırı bir yönlendirici satır (shebang, örn. #!/bin/sh) ile başlıyorsa, belirtilen yorumlayıcı program çalıştırılır ve dosya adı bu yorumlayıcıya argüman olarak aktarılır. Dosya bir metin dosyası ise ancak bir shebang içermiyorsa, kabuk bu dosyayı bir kabuk betiği olarak kabul eder ve dosyayı yürütmek için yeni bir bash alt süreci başlatır.

Harici bir komut bulunamazsa, kabuk command not found hatası bildirir ve çıkış durumu 127 olur. Dosya bulunmasına rağmen yürütülebilir değilse (izin hatası), çıkış durumu 126 olur.

Kabuk Yürütme Ortamı (Shell Execution Environment)

Kabuk, yürütme ortamı (execution environment) olarak adlandırılan ve aşağıdakilerden oluşan bir durum bilgisini korur:

  • Açık dosya tanımlayıcıları (yönlendirmelerle değiştirilmiş)
  • Geçerli çalışma dizini (PWD)
  • Dosya oluşturma maskesi (umask)
  • Yakalanan sinyaller (traps)
  • Kabuk parametreleri ve değişkenleri
  • Kabuk fonksiyonları
  • Yürütme seçenekleri (set ile ayarlananlar)
  • Rumuzlar (aliases)
  • Süreç grupları ve iş denetimi durumu

Bir alt kabuk (subshell) veya harici bir komut çalıştırıldığında, bu ortamın bir kopyası oluşturulur. Ancak, alt kabukta veya harici komutta yapılan ortam değişiklikleri (örn. değişken atamaları, cd ile dizin değiştirme) çağıran ana kabuk ortamını etkilemez.

Çevre Değişkenleri (Environment)

Bir program çalıştırıldığında, ona çevre (environment) adı verilen bir dizgi dizisi aktarılır. Bu dizi, ad=değer biçimindeki değişken tanımlamalarından oluşur.

Kabuk başlatıldığında, kendi ortamından miras aldığı tüm çevre değişkenlerini otomatik olarak kabuk değişkeni olarak tanımlar. export veya declare -x yerleşik komutları kullanılarak yeni kabuk değişkenleri ortama aktarılabilir (dışa aktarılabilir).

Ortama aktarılan değişkenler, kabuk tarafından çalıştırılan tüm alt süreçlere (harici komutlar ve alt kabuklar) otomatik olarak aktarılır. export -n komutu, bir değişkenin dışa aktarma özniteliğini kaldırarak sonraki alt süreçlere aktarılmasını engeller.

İş Denetimi (Job Control)

İş denetimi (job control), terminal oturumunda yürütülmekte olan süreçlerin (işlerin) durdurulmasını, arka plana gönderilmesini veya ön plana alınmasını sağlayan mekanizmadır.

Bir komut satırı & işleciyle sonlandırılırsa, arka planda (background) çalıştırılır. Kabuk komutun bitmesini beklemez ve hemen yeni bir komut istemi sunar. Arka planda çalışan her bir işe kabuk tarafından benzersiz bir iş numarası (job number, örn. [1]) ve süreç kimliği (PID) atanır.

Etkileşimli bir kabukta çalışan bir ön plan komutu, terminalde Ctrl+Z tuşlarına basılarak askıya alınabilir (durdurulabilir). Bu durumda süreç askıya alınır ve kabuk iş numarasını rapor eder.

İş denetimiyle ilgili temel komutlar şunlardır:

  • jobs: Geçerli oturumdaki tüm etkin işleri ve durumlarını listeler.
  • bg [iş_belirteci]: Durdurulmuş bir işi arka planda çalışmaya devam ettirir.
  • fg [iş_belirteci]: Belirtilen işi ön plana (foreground) alır ve kontrolü ona devreder.
  • kill -SİNYAL [iş_belirteci veya PID]: Bir işe veya sürece sinyal gönderir (varsa sonlandırma sinyali SIGTERM).

iş_belirteci (jobspec) şu biçimlerde girilebilir:

  • %n: n numaralı iş.
  • %% veya %+: Geçerli (en son etkileşimde bulunulan) iş.
  • %-: Bir önceki iş.
  • %dizgi: Komut satırı dizgi ile başlayan iş.

Sinyaller (Signals)

Kabuk, aldığı belirli sinyalleri yakalayabilir ve bunlara karşılık gelen komutları yürütebilir (trap).

Örneğin, kabuk etkileşimli olduğunda SIGINT (Ctrl+C) sinyalini yok sayar ve yeni bir istem sunar. Etkileşimsiz kabuklarda ise sinyaller varsayılan sistem davranışıyla işlenir.

Yerleşik trap komutu, belirli sinyaller alındığında yürütülecek komutları tanımlamak için kullanılır (aşağıdaki KABUK YERLEŞİK KOMUTLARI bölümüne bakın).

İstemler (Prompting)

Bash etkileşimli olduğunda, girdi kabul etmeye hazır olduğunu belirtmek için birincil istemi (PS1) görüntüler. Ek girdi beklendiğinde ikincil istem (PS2) görüntülenir.

İstem dizgileri içinde aşağıdaki özel kaçış karakterleri (escape sequences) kullanılabilir:

  • \a: ASCII zil karakteri (hoparlörden ses çıkarır).
  • \d: Tarih bilgisi ("Gün Ay GünNo" biçiminde, örn. "Wed May 21").
  • \D{biçim}: Biçim dizgisine göre yapılandırılmış tarih ve saat bilgisi (strftime(3) biçimi).
  • \e: ASCII kaçış karakteri (escape).
  • \h: İlk noktaya kadar olan kısa bilgisayar adı (hostname).
  • \H: Tam bilgisayar adı (FQDN).
  • \j: Kabuk tarafından denetlenen aktif işlerin sayısı.
  • \l: Kabuğun terminal aygıt adı (tty).
  • \n: Yeni satır karakteri.
  • \r: Satır başı karakteri (carriage return).
  • \s: Kabuğun adı (varsayılan: bash).
  • \t: 24 saatlik saat bilgisi (SS:DD:SS).
  • \T: 12 saatlik saat bilgisi (SS:DD:SS).
  • \@: 12 saatlik ÖÖ/ÖS (AM/PM) formatında saat bilgisi.
  • \A: 24 saatlik formatta saat ve dakika bilgisi (SS:DD).
  • \u: Geçerli kullanıcının kullanıcı adı (username).
  • \v: Bash sürüm numarası (örn. 3.2).
  • \V: Bash yama sürümü dahil sürüm numarası.
  • \w: Geçerli çalışma dizini (PWD). Kullanıcının ev dizini tilde (~) ile gösterilir.
  • \W: Geçerli çalışma dizininin yalnızca son dizin adı (basename).
  • \!: Bu komutun geçmiş listesindeki numarası.
  • \#: Bu kabuk oturumunda girilen komut sayısı.
  • \$: Etkin kullanıcı kimliği root (0) ise #, aksi takdirde $ karakteri.
  • \nnn: Belirtilen sekizlik (octal) sayıya karşılık gelen karakter.
  • \\: Ters eğik çizgi karakterinin kendisi.
  • \[: Yazdırılamayan karakterlerin başlangıcını belirtir. Terminal kontrol kodlarını (örn. renk kodları) istem içine eklemek için kullanılır.
  • \]: Yazdırılamayan karakterlerin sonunu belirtir.

Readline Kütüphanesi

Readline, etkileşimli kabukta komut satırı düzenlemeyi (editing) ve geçmişte arama yapmayı kolaylaştıran kütüphanedir. Varsayılan olarak Emacs düzenleme modu etkindir; istenirse set -o vi ile Vi düzenleme moduna geçilebilir.

Readline ayarları kişisel başlatma dosyası olan ~/.inputrc dosyasından okunur. Bu dosyada tuş bağlamaları (key bindings) ve readline değişkenleri tanımlanabilir.

Readline Değişkenleri

~/.inputrc dosyasında ayarlanabilen bazı önemli readline değişkenleri şunlardır:

  • bell-style: Zil sesini ayarlar (değerler: none, audible, visible).
  • editing-mode: Düzenleme modunu ayarlar (emacs veya vi).
  • history-preserve-point: Geçmiş aramalarında imlecin satırdaki yerini korumasını sağlar (on veya off).
  • show-all-if-ambiguous: Birden fazla eşleşme olduğunda tamamlamaları doğrudan listeler (on veya off).

Readline Klavye Kısayolları (Emacs Modu)

Emacs modunda en sık kullanılan klavye kısayolları şunlardır:

  • Ctrl+A: İmleci satırın başına götürür.
  • Ctrl+E: İmleci satırın sonuna götürür.
  • Ctrl+F: Bir karakter ileri gider.
  • Ctrl+B: Bir karakter geri gider.
  • Meta+F: Bir kelime ileri gider (Mac klavyelerinde Option veya Esc tuşu Meta görevi görür).
  • Meta+B: Bir kelime geri gider.
  • Ctrl+L: Ekranı temizler.
  • Ctrl+D: İmlecin üzerindeki karakteri siler. Satır boş ise kabuktan çıkar (EOF).
  • Ctrl+K: İmlecin bulunduğu konumdan satırın sonuna kadar olan kısmı keser (kill).
  • Ctrl+U: İmlecin bulunduğu konumdan satırın başına kadar olan kısmı keser.
  • Ctrl+Y: En son kesilen (kopyalanan) metni yapıştırır (yank).

Programlanabilir Tamamlama (Programmable Completion)

Programlanabilir tamamlama, kabukta komut argümanları girilirken Tab tuşuna basıldığında otomatik tamamlama seçeneklerinin komuta özel olarak üretilmesini sağlayan mekanizmadır.

Bu mekanizma, complete ve compgen yerleşik komutları kullanılarak yapılandırılır (aşağıdaki KABUK YERLEŞİK KOMUTLARI açıklamasına bakın).

Belirli bir komut için tamamlama kuralları tanımlandığında, Tab tuşuna basıldığında kabuk otomatik olarak ilgili kuralları veya tanımlanmış bir kabuk fonksiyonunu yürüterek olası tamamlamaları üretir ve bunları COMPREPLY dizi değişkenine yerleştirir.

Kısıtlı Kabuk (Restricted Shell)

Bash rbash adıyla başlatılırsa veya başlatma sırasında -r veya --restricted seçeneği verilirse, kabuk kısıtlı (restricted) hale gelir. Kısıtlı kabuk, kullanıcıların sistem üzerinde gerçekleştirebileceği işlemleri sınırlandırarak daha güvenli bir ortam sunar.

Kısıtlı kabukta aşağıdaki işlemlere izin verilmez:

  1. cd komutuyla dizin değiştirmek.
  2. PATH, SHELL, ENV veya BASH_ENV değişkenlerinin değerlerini değiştirmek veya silmek.
  3. / karakteri içeren komut adlarını yürütmek (yani doğrudan dosya yoluyla komut çalıştırmak).
  4. . veya source yerleşik komutlarıyla dosya yolu içeren dosyaları yürütmek.
  5. Yönlendirme işleçleri > veya >> kullanarak dosyalara çıktı yazmak.
  6. set +r veya set +o restricted kullanarak kısıtlı modu devre dışı bırakmak.

Bu kısıtlamalar, başlatma dosyaları (örn. .bash_profile) okunduktan sonra devreye girer. Bu sayede, sistem yöneticisi kullanıcının ev dizinindeki başlatma dosyalarında gerekli ayarları güvenli bir şekilde yapabilir.

Kabuk Yerleşik Komutları (Shell Builtin Commands)

Kabuk yerleşik komutları (builtin commands), harici bir dosyayı çalıştırmak yerine doğrudan kabuk sürecinin kendi içinde yürütülen komutlardır. Bu komutlar sistem performansını artırır ve kabuk durumunu (ortamını) doğrudan değiştirebilmelerini sağlar (örn. cd komutunun dizin değiştirebilmesi için yerleşik olması zorunludur).

Aşağıda en sık kullanılan yerleşik komutlar ve açıklamaları yer almaktadır:

alias

alias [ad[=değer] ...]

Argümansız çağrıldığında, tanımlı tüm rumuzları standart çıktıya yazdırır. Bir veya daha fazla ad belirtilirse, bunlara karşılık gelen rumuz tanımlarını görüntüler. ad=değer biçiminde çağrıldığında, belirtilen ad için yeni bir rumuz tanımlar.

bg

bg [iş_belirteci ...]

Askıya alınmış veya durdurulmuş olan işleri arka planda çalışmaya devam ettirir. iş_belirteci belirtilmemişse, geçerli iş (current job) kullanılır.

bind

bind [-m anahtar_haritası] [-lpsvPSV]
bind [-m anahtar_haritası] -q fonksiyon
bind [-m anahtar_haritası] -f dosya
bind [-m anahtar_haritası] tuş_bağı:fonksiyon_adı

Readline tuş bağlamalarını (key bindings) ve readline değişkenlerini sorgular ve değiştirir.

break

break [n]

for, while, until veya select döngülerinden çıkmayı sağlar. n belirtilmişse, n. düzeydeki döngüden çıkar (iç içe döngüler için). n, 1'den büyük veya eşit olmalıdır.

builtin

builtin yerleşik-komut [argümanlar]

Belirtilen kabuk yerleşik komutunu yürütür ve yerleşik komutla aynı ada sahip herhangi bir kabuk fonksiyonunu devre dışı bırakır.

cd

cd [-L|[-P [-e]]] [dizin]

Geçerli çalışma dizinini dizin olarak değiştirir. dizin belirtilmemişse HOME değişkeninin değerine geçer. CDPATH değişkeni tanımlıysa, dizin araması bu yollarda da yapılır. -P seçeneği sembolik bağları takip etmek yerine fiziksel dizin yapısını kullanmayı sağlar.

complete

complete [-abcdefgjksuv] [-o seçeneği] [-A eylem] [-G desen] [-W sözcük-listesi] [-F fonksiyon] [-C komut] ad [ad ...]

Belirtilen komutlar (ad) için otomatik tamamlama (completion) kurallarını tanımlar.

compgen

compgen [-abcdefgjksuv] [-o seçeneği] [-A eylem] [-G desen] [-W sözcük-listesi] [-F fonksiyon] [-C komut] [sözcük]

Belirtilen seçeneklere ve girdilere göre olası tamamlama seçeneklerini üretir. complete komutuyla birlikte otomatik tamamlama işlevleri yazmak için kullanılır.

continue

continue [n]

En içteki for, while, until veya select döngüsünün bir sonraki yinelemesine (iteration) geçer. n belirtilmişse, n. düzeydeki döngünün bir sonraki yinelemesine geçer.

declare

declare [-aAfFgilrtux] [-p] [ad[=değer] ...]

Kabuk değişkenlerini ve özniteliklerini tanımlar, değiştirir veya değerlerini ve özniteliklerini görüntüler. Seçenekler:

  • -a: Dizinlenmiş dizi (indexed array) tanımlar.
  • -A: İlişkisel dizi (associative array) tanımlar.
  • -f: Yalnızca fonksiyon adlarını ve tanımlarını görüntüler.
  • -F: Yalnızca tanımlı fonksiyonların adlarını (ve yer aldıkları dosyayı) görüntüler.
  • -g: Değişkenleri fonksiyonların içindeyken bile küresel (global) kapsamda tanımlar.
  • -i: Değişkeni bir tamsayı (integer) olarak tanımlar; bu değişkene yapılan atamalar aritmetik ifade olarak değerlendirilir.
  • -r: Değişkeni salt okunur (readonly) yapar; değerleri daha sonra değiştirilemez.
  • -t: Değişkeni izleme (trace) özniteliğiyle işaretler.
  • -u: Değişkenin değerindeki harfleri otomatik olarak büyük harfe çevirir.
  • -x: Değişkeni çevre (environment) değişkeni olarak dışa aktarır (export).

dirs

dirs [-clpv] [+n] [-n]

Geçerli dizin yığınının (directory stack) içeriğini görüntüler. Dizin yığınını yönetmek için pushd ve popd komutları kullanılır.

disown

disown [-ar] [-h] [iş_belirteci ...]

Belirtilen işleri kabuğun aktif işler listesinden çıkarır; böylece kabuk çıktığında bu işlere SIGHUP sinyali gönderilmez.

echo

echo [-neE] [argüman ...]

Argümanları aralarında boşluklar olacak ve sonuna yeni satır karakteri eklenecek şekilde standart çıktıya yazdırır. Seçenekler:

  • -n: Sonuna yeni satır karakteri eklemez.
  • -e: Ters eğik çizgili kaçış karakterlerinin (örn. \n, \t) yorumlanmasını etkinleştirir.
  • -E: Kaçış karakterlerinin yorumlanmasını devre dışı bırakır (varsayılan).

enable

enable [-a] [-dnps] [-f dosya] [ad ...]

Kabuk yerleşik komutlarını etkinleştirir veya devre dışı bırakır. Bu komut, sistemde yerleşik komutla aynı adı taşıyan harici bir komutun çalıştırılmasına olanak tanımak için yerleşik komutu devre dışı bırakmayı sağlar.

eval

eval [argüman ...]

Argümanları birleştirerek tek bir komut satırı oluşturur, bu satırı kabuk kurallarına göre yeniden okur ve yürütür.

exec

exec [-cl] [-a ad] [komut [argümanlar]]

Eğer komut belirtilmişse, kabuk sürecini yeni bir süreç oluşturmadan belirtilen komutla değiştirir (kabuk sonlanır ve yerini komut alır). Eğer yönlendirmeler belirtilmişse, bu yönlendirmeler geçerli kabuk ortamında kalıcı olarak uygulanır.

  • nullglob: Ayarlanırsa bash, hiçbir dosyayla eşleşmeyen desenlerin (yukarıdaki Dosya Yolu Genişletme bölümüne bakın) kendileri yerine boş bir dizgiye genişlemesine izin verir.

  • progcomp: Ayarlanırsa programlanabilir tamamlama özellikleri (yukarıdaki Programlanabilir Tamamlama bölümüne bakın) etkinleştirilir. Bu seçenek varsayılan olarak etkindir.

  • promptvars: Ayarlanırsa istem dizgileri, yukarıdaki İSTEMLER bölümünde açıklandığı gibi genişletildikten sonra parametre genişletme, komut değiştirme, aritmetik genişletme ve tırnak temizlemeye tabi tutulur. Bu seçenek varsayılan olarak etkindir.

  • restricted_shell: Kabuk kısıtlı modda başlatılırsa bu seçeneği ayarlar (aşağıdaki KISITLI KABUK bölümüne bakın). Bu değer değiştirilemez. Başlangıç dosyaları yürütüldüğünde bu sıfırlanmaz, böylece başlangıç dosyalarının bir kabuğun kısıtlı olup olmadığını keşfetmesine olanak tanır.

  • shift_verbose: Ayarlanırsa shift yerleşik komutu, kaydırma sayısı konumsal parametrelerin sayısını aştığında bir hata mesajı yazdırır.

  • sourcepath: Ayarlanırsa source (.) yerleşik komutu, argüman olarak sunulan dosyayı içeren dizini bulmak için PATH değerini kullanır. Bu seçenek varsayılan olarak etkindir.

  • xpg_echo: Ayarlanırsa echo yerleşik komutu varsayılan olarak ters eğik çizgi kaçış dizilerini genişletir.

  • suspend [-f]: Bir SIGCONT sinyali alana kadar bu kabuğun yürütülmesini askıya alır. -f seçeneği, bir oturum açma kabuğu olsa bile şikayet etmemesini; her halükarda askıya almasını söyler. Kabuk bir oturum açma kabuğu olmadıkça ve -f sunulmadıkça veya iş denetimi etkin olmadıkça dönüş durumu 0'dır.

  • test ifade / [ ifade ]: ifade koşullu ifadesinin değerlendirmesine bağlı olarak 0 veya 1 durumu döndürür. Her bir işleç ve işlenen ayrı bir argüman olmalıdır. İfadeler yukarıda KOŞULLU İFADELER altında açıklanan birincillerden oluşur. test herhangi bir seçeneği kabul etmez, seçeneklerin sonunu belirtmek üzere bir -- argümanını da kabul etmez ve yok saymaz.

    İfadeler azalan öncelik sırasına göre listelenen aşağıdaki işleçler kullanılarak birleştirilebilir.

    • ! ifade: ifade yanlışsa doğrudur.
    • ( ifade ): ifade değerini döndürür. Bu, işleçlerin normal önceliğini geçersiz kılmak için kullanılabilir.
    • ifade1 -a ifade2: Hem ifade1 hem de ifade2 doğruysa doğrudur.
    • ifade1 -o ifade2: ifade1 veya ifade2'den biri doğruysa doğrudur.

    test ve [ koşullu ifadeleri argüman sayısına dayalı bir kurallar kümesi kullanarak değerlendirir.

    • 0 argüman: İfade yanlıştır.
    • 1 argüman: Argüman boş değilse ifade doğrudur.
    • 2 argüman: İlk argüman ! ise, ikinci argüman boş ise ifade doğrudur. İlk argüman KOŞULLU İFADELER altında listelenen tekli koşullu işleçlerden biriyse, tekli test doğruysa ifade doğrudur. İlk argüman geçerli bir tekli koşullu işleç değilse ifade yanlıştır.
    • 3 argüman: İkinci argüman KOŞULLU İFADELER altında listelenen ikili koşullu işleçlerden biriyse, ifadenin sonucu birinci ve üçüncü argümanları işlenen olarak kullanan ikili testin sonucudur. İlk argüman ! ise, değer ikinci ve üçüncü argümanları kullanan iki argümanlı testin olumsuzlamasıdır. İlk argüman tam olarak ( ve üçüncü argüman tam olarak ) ise, sonuç ikinci argümanın tek argümanlı testidir. Aksi takdirde ifade yanlıştır. -a ve -o işleçleri bu durumda ikili işleçler olarak kabul edilir.
    • 4 argüman: İlk argüman ! ise, sonuç kalan argümanlardan oluşan üç argümanlı ifadenin olumsuzlamasıdır. Aksi takdirde ifade, yukarıda listelenen kurallar kullanılarak önceliğe göre ayrıştırılır ve değerlendirilir.
    • 5 veya daha fazla argüman: İfade, yukarıda listelenen kurallar kullanılarak önceliğe göre ayrıştırılır ve değerlendirilir.
  • times: Kabuk ve kabuktan çalıştırılan süreçler için birikmiş kullanıcı ve sistem sürelerini yazdırır. Dönüş durumu 0'dır.

  • trap [-lp] [[argüman] sinyalbelirleyici ...]: Kabuk sinyalbelirleyici sinyallerini aldığında argüman komutu okunacak ve yürütülecektir. argüman mevcut değilse (ve tek bir sinyalbelirleyici varsa) veya - ise, belirtilen her bir sinyal orijinal eğilimine (kabuğa girerken sahip olduğu değere) sıfırlanır. argüman boş dizgi ise belirtilen her bir sinyalbelirleyici kabuk ve çağırdığı komutlar tarafından yok sayılır. argüman mevcut değilse ve -p sağlanmışsa, her bir sinyalbelirleyici ile ilişkili trap komutları görüntülenir. Hiçbir argüman sağlanmazsa veya yalnızca -p verilirse trap, her bir sinyalle ilişkili komutların listesini yazdırır. -l seçeneği kabuğun sinyal adlarının ve bunlara karşılık gelen numaraların bir listesini yazdırmasına neden olur. Her bir sinyalbelirleyici, <signal.h> içinde tanımlanan bir sinyal adı veya bir sinyal numarasıdır. Sinyal adları büyük/küçük harfe duyarsızdır ve SIG ön eki isteğe bağlıdır.

    Bir sinyalbelirleyici EXIT (0) ise, argüman komutu kabuktan çıkışta yürütülür. Bir sinyalbelirleyici DEBUG ise, argüman komutu her basit komuttan, for komuttan, case komuttan, select komuttan, her aritmetik for komuttan önce ve bir kabuk fonksiyonunda ilk komut yürütülmeden önce yürütülür (yukarıdaki KABUK DİL BİLGİSİ bölümüne bakın). DEBUG trap'i üzerindeki etkisi hakkında ayrıntılar için shopt yerleşik komutunun extdebug seçeneğinin açıklamasına bakın. Bir sinyalbelirleyici ERR ise, argüman komutu basit bir komut sıfır olmayan bir çıkış durumuyla çıktığında aşağıdaki koşullara tabi olmak üzere yürütülür. Başarısız olan komut bir while veya until anahtar sözcüğünü hemen takip eden komut listesinin bir parçasıysa, bir if ifadesindeki testin bir parçasıysa, bir && veya || listesinin bir parçasıysa ya da komutun dönüş değeri ! ile tersine çevriliyorsa ERR trap'i yürütülmez. Bunlar errexit seçeneği tarafından uyulan koşullarla aynıdır. Bir sinyalbelirleyici RETURN ise, bir kabuk fonksiyonu veya . (source) ile yürütülen bir betik yürütmeyi tamamladığında argüman komutu yürütülür. Kabuğa girişte yok sayılan sinyaller yakalanamaz veya sıfırlanamaz. Yok sayılmayan yakalanmış sinyaller bir çocuk süreç oluşturulduğunda orijinal değerlerine sıfırlanır. Herhangi bir sinyalbelirleyici geçersiz olmadıkça dönüş durumu false, aksi takdirde trap true döndürür.

  • type [-aftpP] ad [ad ...]: Seçenekler olmadan, her bir ad'ın bir komut adı olarak kullanıldığında nasıl yorumlanacağını belirtir. -t seçeneği kullanılırsa type; ad sırasıyla bir rumuz, kabuk ayrılmış sözcüğü, fonksiyon, yerleşik komut veya disk dosyası ise alias, keyword, function, builtin veya file dizgilerinden birini yazdırır. ad bulunamazsa hiçbir şey yazdırılmaz ve false çıkış durumu döndürür. -p seçeneği kullanılırsa type; ad komut adı olarak belirtildiğinde yürütülecek disk dosyasının adını döndürür veya type -t ad'' `file` döndürmeyecekse hiçbir şey döndürmez. `-P` seçeneği, type -t ad'' file döndürmeyecek olsa bile her bir ad için bir PATH aramasını zorunlu kılar. Bir komut karma hale getirilmişse (hashed), -p ve -P karma hale getirilmiş değeri yazdırır, PATH içinde ilk görünen dosyayı yazdırılması zorunlu değildir. -a seçeneği kullanılırsa type, ad adında bir yürütülebilir dosya içeren tüm yerleri yazdırır. Bu, yalnızca ve yalnızca -p seçeneği de kullanılmadığında rumuzları ve fonksiyonları içerir. -a kullanılırken karma komutlar tablosuna başvurulmaz. -f seçeneği command yerleşik komutunda olduğu gibi kabuk fonksiyonu aramasını engeller. Argümanlardan herhangi biri bulunursa type true, hiçbiri bulunamazsa false döndürür.

  • ulimit [-SHacdefilmnpqrstuvx [limit]]: Bu tür bir denetime izin veren sistemlerde, kabuk ve onun tarafından başlatılan süreçler için kullanılabilir kaynaklar üzerinde denetim sağlar. -H ve -S seçenekleri, verilen kaynak için sert (hard) veya yumuşak (soft) sınırın ayarlandığını belirtir. Bir sert sınır ayarlandıktan sonra artırılamaz; bir yumuşak sınır sert sınırın değerine kadar artırılabilir. Ne -H ne de -S belirtilmemişse hem yumuşak hem de sert sınırlar ayarlanır. limit değeri, kaynak için belirtilen birimdeki bir sayı veya sırasıyla geçerli sert sınırı, geçerli yumuşak sınırı ve sınırsızlığı temsil eden özel hard, soft veya unlimited değerlerinden biri olabilir. limit atlanırsa, -H seçeneği verilmedikçe kaynağın yumuşak sınırının geçerli değeri yazdırılır. Birden fazla kaynak belirtildiğinde, değerden önce sınır adı ve birimi yazdırılır. Diğer seçenekler aşağıdaki gibi yorumlanır:

    • -a: Tüm geçerli sınırlar rapor edilir
    • -c: Oluşturulan çekirdek (core) dosyalarının maksimum boyutu
    • -d: Bir sürecin veri segmentinin maksimum boyutu
    • -e: Maksimum zamanlama önceliği ("nice")
    • -f: Kabuk ve çocukları tarafından yazılan dosyaların maksimum boyutu
    • -i: Maksimum bekleyen sinyal sayısı
    • -l: Belleğe kilitlenebilecek maksimum boyut
    • -m: Maksimum yerleşik küme boyutu (resident set size)
    • -n: Maksimum açık dosya tanımlayıcısı sayısı (çoğu sistem bu değerin ayarlanmasına izin vermez)
    • -p: 512 baytlık bloklar halinde boru (pipe) boyutu (bu ayarlanamaz)
    • -q: POSIX ileti kuyruklarındaki maksimum bayt sayısı
    • -r: Maksimum gerçek zamanlı zamanlama önceliği
    • -s: Maksimum yığın (stack) boyutu
    • -t: Saniye cinsinden maksimum CPU süresi miktarı
    • -u: Tek bir kullanıcı için kullanılabilir maksimum süreç sayısı
    • -v: Kabuk için kullanılabilir maksimum sanal bellek miktarı
    • -x: Maksimum dosya kilidi sayısı

    limit verilirse, belirtilen kaynağın yeni değeridir (-a seçeneği yalnızca görüntüleme içindir). Hiçbir seçenek verilmezse -f varsayılır. Değerler; saniye cinsinden olan -t, 512 baytlık bloklar biriminde olan -p ve ölçeklendirilmemiş değerler olan -n ve -u hariç, 1024 baytlık artışlarladır. Geçersiz bir seçenek veya argüman sunulmadıkça ya da yeni bir sınır ayarlanırken bir hata oluşmadıkça dönüş durumu 0'dır.

  • umask [-p] [-S] [mod]: Kullanıcı dosya oluşturma maskesi mod olarak ayarlanır. mod bir rakamla başlıyorsa sekizlik bir sayı olarak yorumlanır; aksi takdirde chmod(1) tarafından kabul edilene benzer sembolik bir mod maskesi olarak yorumlanır. mod atlanırsa maskenin geçerli değeri yazdırılır. -S seçeneği maskenin sembolik biçimde yazdırılmasına neden olur; varsayılan çıktı sekizlik bir sayıdır. -p seçeneği sağlanırsa ve mod atlanırsa çıktı, girdi olarak yeniden kullanılabilecek bir biçimdedir. Mod başarıyla değiştirildiyse veya hiçbir mod argümanı sağlanmadıysa dönüş durumu 0, aksi takdirde false'tur.

  • unalias [-a] [ad ...]: Tanımlı rumuzlar listesinden her bir ad'ı kaldırır. -a sağlanırsa tüm rumuz tanımları kaldırılır. Sağlanan bir ad tanımlı bir rumuz olmadıkça dönüş değeri true'dur.

  • unset [-fv] [ad ...]: Her bir ad için ilgili değişkeni veya fonksiyonu kaldırır. Hiçbir seçenek sunulmazsa veya -v seçeneği verilirse her bir ad bir kabuk değişkenine başvurur. Salt okunur değişkenler silinemez (unset). -f belirtilirse her bir ad bir kabuk fonksiyonuna başvurur ve fonksiyon tanımı kaldırılır. Silinen her bir değişken veya fonksiyon sonraki komutlara aktarılan ortamdan kaldırılır. RANDOM, SECONDS, LINENO, HISTCMD, FUNCNAME, GROUPS veya DIRSTACK değişkenlerinden herhangi biri silinirse, daha sonra yeniden ayarlansalar bile özel özelliklerini kaybederler. Bir ad salt okunur olmadıkça çıkış durumu true'dur.

  • wait [n ...]: Belirtilen her bir süreci bekler ve sonlandırma durumunu döndürür. Her bir n bir süreç kimliği (PID) veya bir iş belirtimi olabilir; bir iş belirtimi verilirse o işin boru hattındaki tüm süreçler beklenir. n verilmezse o anda aktif olan tüm çocuk süreçler beklenir ve dönüş durumu sıfırdır. n mevcut olmayan bir süreci veya işi belirtiyorsa dönüş durumu 127'dir. Aksi takdirde dönüş durumu, beklenen son sürecin veya işin çıkış durumudur.

Kısıtlı Kabuk (Restricted Shell)

Bash rbash adıyla başlatılırsa veya çağrılırken -r seçeneği sunulursa kabuk kısıtlı hale gelir. Kısıtlı bir kabuk, standart kabuktan daha fazla denetlenen bir ortam ayarlamak için kullanılır. Aşağıdakilerin yasaklanması veya gerçekleştirilmemesi dışında bash ile tamamen aynı davranır:

  • cd ile dizin değiştirmek
  • SHELL, PATH, ENV veya BASH_ENV değerlerini ayarlamak veya kaldırmak (unset)
  • / içeren komut adlarını belirtmek
  • . (source) yerleşik komutuna argüman olarak / içeren bir dosya adı belirtmek
  • hash yerleşik komutuna verilen -p seçeneğine argüman olarak eğik çizgi içeren bir dosya adı belirtmek
  • başlangıçta kabuk ortamından fonksiyon tanımlarını içe aktarmak
  • başlangıçta kabuk ortamından SHELLOPTS değerini çözümlemek
  • >, >|, <>, >&, &> ve >> yönlendirme işleçlerini kullanarak çıktıyı yönlendirmek
  • kabuğun yerine başka bir komut koymak için exec yerleşik komutunu kullanmak
  • enable yerleşik komutuna verilen -f ve -d seçenekleriyle yerleşik komutlar eklemek veya silmek
  • Devre dışı bırakılmış kabuk yerleşiklerini etkinleştirmek için enable yerleşik komutunu kullanmek
  • command yerleşik komutuna -p seçeneğini belirtmek
  • set +r veya set +o restricted ile kısıtlı modu kapatmak.

Bu kısıtlamalar tüm başlangıç dosyaları okunduktan sonra uygulanır.

Bir kabuk betiği olduğu anlaşılan bir komut yürütüldüğünde (yukarıdaki KOMUT YÜRÜTME bölümüne bakın), rbash betiği yürütmek üzere oluşturulan kabuktaki tüm kısıtlamaları kapatır.

Ayrıca Bakınız

  • Bash Reference Manual, Brian Fox ve Chet Ramey
  • The Gnu Readline Library, Brian Fox ve Chet Ramey
  • The Gnu History Library, Brian Fox ve Chet Ramey
  • Portable Operating System Interface (POSIX) Part 2: Shell and Utilities, IEEE
  • sh(1), ksh(1), csh(1)
  • emacs(1), vi(1)
  • readline(3)

Dosyalar

  • /bin/bash: bash yürütülebilir dosyası
  • /etc/profile: Oturum açma kabukları için yürütülen sistem genelindeki başlatma dosyası
  • ~/.bash_profile: Oturum açma kabukları için yürütülen kişisel başlatma dosyası
  • ~/.bashrc: Etkileşimli kabuk başına bireysel başlangıç dosyası
  • ~/.bash_logout: Oturum açma kabuğundan çıkıldığında yürütülen bireysel oturum kapatma dosyası
  • ~/.inputrc: Bireysel readline başlatma dosyası

Yazarlar

Brian Fox, Free Software Foundation
bfox@gnu.org

Chet Ramey, Case Western Reserve University
chet@po.cwru.edu

Hata Raporları

Bash içinde bir hata (bug) bulursanız bunu rapor etmelisiniz. Ancak öncelikle bunun gerçekten bir hata olduğundan ve bash'in en son sürümünde göründüğünden emin olmalısınız. En son sürüm her zaman ftp://ftp.gnu.org/pub/bash/ adresinde mevcuttur.

Bir hatanın gerçekten var olduğunu belirledikten sonra, bir hata raporu göndermek için bashbug komutunu kullanın. Bir düzeltmeniz varsa bunu da göndermeniz önerilir! Öneriler ve "felsefi" hata raporları bug-bash@gnu.org adresine e-postayla gönderilebilir veya gnu.bash.bug Usenet haber grubuna gönderilebilir.

TÜM hata raporları şunları içermelidir:

  • Bash'in sürüm numarası
  • Donanım ve işletim sistemi
  • Derlemek için kullanılan derleyici
  • Hata davranışının bir açıklaması
  • Hatayı gösteren kısa bir betik veya "tarif"

bashbug ilk üç öğeyi, bir hata raporu dosyalamak için sağladığı şablona otomatik olarak ekler.

Bu kılavuz sayfasıyla ilgili yorumlar ve hata raporları chet@po.cwru.edu adresine gönderilmelidir.

Hatalar (Bugs)

Çok büyük ve çok yavaş.

Bash ile sh'nin geleneksel sürümleri arasında, çoğunlukla POSIX spesifikasyonu nedeniyle bazı ince farklar vardır.

Rumuzlar bazı kullanımlarda kafa karıştırıcıdır.

Kabuk yerleşik komutları ve fonksiyonları durdurulamaz/yeniden başlatılamaz.

Süreç askıya alınması denendiğinde a ; b ; c biçimindeki bileşik komutlar ve komut dizileri şık bir şekilde ele alınmaz. Bir süreç durdurulduğunda kabuk hemen dizideki bir sonraki komutu yürütür. Komut dizisini bir alt kabuğa zorlamak için parantez arasına almak yeterlidir; böylece bir bütün olarak durdurulabilir.

$(...) komut değiştirmesi içindeki komutlar, değiştirme denenene kadar ayrıştırılmaz. Bu durum, hata raporlamasını komut girildikten bir süre sonrasına erteleyecektir. Örneğin kabuk yorumları içinde olsa bile eşleşmeyen parantezler, yapı okunurken hata mesajlarıyla sonuçlanacaktır.

Dizi değişkenleri (henüz) dışa aktarılamaz.

GNU Bash-3.2 2006 September 28 BASH(1)