Bash

Şuraya atla: kullan, ara

Bash, GNU projesi için yazılmış bir Unix komut kabuğudur. İsmi eski, önemli bir Unix kabuğu olan Bourne shell (Bourne kabuğu)ndaki (sh) Bourne-again shell — (Bourne again / born again) için bir kısaltmadır. Bourne kabuğu, 1978'de yayınlanan, Unix Sürüm 7x ile dağıtılan kabuktu. Özgün Bourne kabuğu, o zamanlar Bell Laboratuarlarında araştırmacı olan Stephen Bourne tarafından yazılmıştı. Bash kabuğu, 1987'de, Brian Fox tarafından yazılmıştı. 1990'da, Chet Ramey, ana yöneticisi oldu. Bash, çoğu Linux dizgesindeki öntanımlı kabuktur.

Bash sözdizimi önemli noktaları

Bash'in komut sözdizimi, Bourne kabuğu'nun komut sözdiziminin bir üst kümesidir. Bash'in komut sözdiziminin tam şartnamesi, GNU Projesi tarafından dağıtılan Bash Referans Elkitabıdır. Bu bölüm, Bash'in bazı özgün sözdizimi özelliklerini vurgulamaktadır.

Bourne kabuğu komut dosyalarının büyük çoğunluğu, bir Bourne özel değişkenine gönderme yapan veya Bourne yerleşik komutu kullanan bazı Bourne kabuğu komut dosyaları dışında, değişiklik yapılmaksızın, Bash tarafından yürütülebilir. Bash komut sözdizimi; komut-satırı düzenlemesi, komut geçmişi, dizin yığını, $RANDOM ve $PPID değişkenleri ve POSIX komut değişim sözdizimi: $(...) gibi, Korn shell (Korn kabuğundan) (ksh) ve C shell (C kabuğundan) (csh) elde edilen fikirleri içerir. Etkileşimli komut kabuğu olarak kullanılırken Bash, kullanıcı TAB tuşuna bastığında, kısmen yazılmış program isimlerinin, dosya isimlerinin, değişken isimlerinin vb. tamamlanmasını destekler.

Bash sözdiziminin, Bourne kabuğunda olmayan pek çok eklentisi bulunmaktadır. Bu eklentilerin birkaçı burada sıralandırılmıştır.

Tamsayı (Integer) Matematiği

Bourne kabuğunun önemli bir kısıtlaması, bir dış işlem üretmeden tamsayı hesaplamaları yapamamasıdır. Bash ((...)) komutunu ve $[...] değişken sözdizimini şu şekilde kullanarak, işlem-içi tamsayı hesaplamaları gerçekleştirebilir:

VAR=55             # VAR değişkenine 55 tamsayısını ata.
((VAR = VAR + 1))  # VAR değişkenine 1 ekle.  '$' karakteri olmadığına dikkat edin.
((++VAR))          # VAR'a 1 eklemenin bir başka yolu.  C-biçimi ön-artırma yapar.
((VAR++))          # VAR'a 1 eklemenin bir başka yolu.  C-biçimi son-artırma yapar.
echo $[VAR * 22]   # VAR'ı 22 ile çarp ve sonucu komuta yazdır.
echo $((VAR * 22)) # Yukarıdakini yapmanın başka bir yolu.

((...)) komutu ayrıca koşullu ifadelerde de kullanılabilir, çünkü exit status (çıkış durumu) koşulun doğru veya yanlış olmasına göre 0 veya 1'dir:

if ((VAR == Y * 3 + X * 2))
then
        echo Yes
fi

((Z > 23)) && echo Yes

((...)) komutu şu relational operator (ilişkisel işleçleri) destekler: '==', '!=', '>', '<', '>=', and '<='.

Bash, işlem-içi floating point (kayan noktalı) hesaplamaları gerçekleştiremez. Bunu gerçekleştirebilen Unix komut kabukları, yalnızca Korn Shell (Korn Kabuğu) (1993 sürümü) ve (sürüm 4.0'dan itibaren) zsh'dır.

I/O yönlendirmesi

Bash'in Bourne kabuğunda olmayan birkaç I/O yönlendirme sözdizimi bulunmaktadır. Bash standard output (standart çıktı)yı ve standard hatayı, aynı anda şu sözdizimini kullanarak yönlendirebilir:

command &> file

ki bu eşdeğer Bourne kabuğu sözdiziminde "command > file 2>&1" yazmaktan daha kolaydır. Bash, sürüm 2.05b'den beri, bir dizeden (string) standart girdiyi, şu sözdizimini kullanarak yönlendirebilir (bunlara bazen "here strings" ("burada dizeleri") denir):

command <<< "standart girdi olarak okunacak dize"

Eğer dizede boşluk varsa, tırnak içinde olmalıdır.

Örnek: Standart çıktıyı bir dosyaya yönlendir, veriyi yaz, dosyayı kapat, stdout'u sıfırla

# Filedescriptor(FD) 6'yı stdout (FD 1)'in bir kopyası yap
exec 6>&1
# "test.data" dosyasını yazmak için aç
exec 1>test.data
# içerik üret
echo "data:data:data"
# "test.data" dosyasını kapat
exec 1>&-
# stdout'u FD 6'nın bir kopyası yap (stdout'u sıfırla)
exec 1>&6
# FD6'yı kapat
exec 6>&-

Dosya aç ve kapat

# test.data dosyasını okumak için aç
exec 6<test.data
# dosya sonuna kadar oku
while read -u 6 dta
do
  echo "$dta" 
done
# test.data dosyasını kapat
exec 6<&-

Dış komutların çıktısını yakala

 # 'bul' çalıştır ve sonuçları VAR'da sakla
 # "h" harfiyle biten dosya adlarını ara
 VAR=$(find . -name "*h")

İşlem-içi düzenli ifadeler (regular expressions)

Bash 3.0, Perli hatırlatan, şu sözdizimi kullanarak, işlem-içi regular expression (düzenli ifade) eşlemesini destekler:

[[ string =~ regex ]]

Düzenli ifade sözdizimi regex(3) man page (elkitabı sayfası)nda belgelendirilenle aynıdır. Yukarıdaki komutun çıkış durumu, eğer regex dizeyle aynıysa 0'dır, değilse 1'dir. Düzenli ifadedeki parentezli alt ifadelere, şu şekilde, BASH_REMATCH kabuk değişkenini kullanarak erişilebilir:

if [[ abcfoobarbletch =~ 'foo(bar)bl(.*)' ]]
then
        echo The regex matches!
        echo $BASH_REMATCH      -- outputs: foobarbletch
        echo ${BASH_REMATCH[1]} -- outputs: bar
        echo ${BASH_REMATCH[2]} -- outputs: etch
fi

Bu sözdizimi, bir grep komutu koşturmak için, ayrı bir işlem üretmekten daha iyi performans sağlar, çünkü, düzenli ifade eşleştirmesi, Bash işleminin içinde yer alır. Eğer, düzenli ifade veya dize, boşluk veya kabuk metacharacter (metakarakter)leri ('*' veya '?' gibi) içeriyorsa, tırnak içinde olmalıdırlar.

Ters bölü çıkışları

$'string' biçimindeki kelimeler, özel muamele görür. Kelime, ters bölü-çıkış karakterlerinin C programming language (C Programlama Dili)nde belirtildiği gibi değiştirilmiş haliyle, string olur. Ters bölü çıkış dizileri, varsa, şu şekilde çözümlenir:

Ters Bölü Çıkışları
Ters bölü
Çıkış
Şu olur ...
\a Bir uyarı (zil) karakteri
\b Bir geri-al (backspace) karakteri
\e Bir çıkış (escape) karakteri
\f Bir sayfa başı (form feed) karakteri
\n Bir yeni satır (new line) karakteri
\r Bir satır başı (carriage return) karakteri
\t Bir yatay durak (horizontal tab) karakteri
\v Bir düşey durak (vertical tab) karakteri
\\ Bir ters bölü (backslash) karakteri
\' Bir tek tırnak karakteri
\nnn Değeri sekizli değer nnn olan (bir ila üç rakam) sekiz-bit karakter
\xHH Değeri onaltılı değer HH olan (bir veya iki hex rakamı) sekiz-bit karakter
\cx Bir kontrol-X karakteri

Açımlanan çözüm, dolar işareti hiç olmamış gibi, tek-tırnaklıdır.

Önünde bir dolar işareti bir çift tırnaklı dize, ($"...") dizenin varolduğu yere göre çevrilmesine neden olacaktır. Eğer, yer C veya POSIX ise, dolar işareti dikkate alınmaz. Eğer, dize çevrilir ve değiştirilirse, yerine geçen ifade, çift tırnaklı olur.

Bash başlangıç komut dosyaları

Bash başladığında, çeşitli komut dosyalarındaki komutları yürütür.

Bash --login seçeneğiyle bir etkileşimli giriş kabuğu veya bir etkileşimsiz kabuk olarak çağrıldığında, önce /etc/profile dosyasından, eğer dosya bulunuyorsa, komutları okur ve yürütür. Bu dosyayı okuduktan sonra, sırasıyla ~/.bash_profile, ~/.bash_login, ve ~/.profile'ı arar, bulunuyorsa ve okunabiliyorsa, ilkindeki komutları okur ve yürütür. --noprofile seçeneği, kabuk başlatıldığında bu davranışı etkisiz hale getirmek için kullanılabilir.

Bir giriş kabuğundan çıkıldığında, Bash, eğer bulunuyorsa, ~/.bash_logout dosyasındaki komutları okur ve yürütür.

Giriş kabuğu olmayan bir etkileşimli kabuk başlatıldığında, Bash, eğer bulunuyorsa, ~/.bashrc'deki komutları okur ve yürütür. Bu --norc seçeneği kullanılarak etkisiz duruma getirilebilir. --rcfile dosya seçeneği Bash'in ~/.bashrc yerine dosya dan komut okumasını ve yürütmesini sağlayacaktır.

Bash, etkileşimsiz olarak, örneğin bir kabuk-komut dosyası koşturmak için, başlatıldığında, ortamda BASH_ENV değişkenini arar, oradaysa, değerine ekleme yapar ve ekli değeri okunup yürütülecek bir dosya ismi olarak kullanır. Bash, şu komut yürütülmüş gibi davranır:

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

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

Eğer, Bash sh adıyla çağrıldıysa, sh'in eski sürümlerinin başlangıç davranışlarını, aynı zamanda POSIX standardına da uyarak, olağanca taklit etmeye çalışır. Etkileşimli giriş kabuğu veya --login seçeneğiyle etkileşimsiz kabuk olarak çağrıldığında, önce sırasıyla /etc/profile ve ~/.profile'den komut okumayı ve yürütmeyi dener. --noprofile seçeneği bu davranışı etkisizleştirmek için kullanılabilir. sh adıyla etkileşimli bir kabuk olarak çağrıldığında Bash, ENV değişkenini arar, tanımlıysa değerine ekleme yapar ve ekli değeri okunacak ve yürütülecek bir dosya adı olarak kullanır. sh olarak çağrılan bir kabuk, başka herhangi bir başlangıç dosyasından komut okuma ve yürütme yapmayı denemediği için, --rcfile seçeneğinin bir etkisi yoktur. sh adıyla çağrılan etkileşimsiz bir kabuk, başka herhangi bir başlangıç dosyasını okumayı denemez. sh olarak çağrıldığında, başlangıç dosyaları okunduktan sonra Bash posix moduna girer.

Bash, posix modunda başlatıldığında, --posix komut satırı seçeneğiyle olduğu gibi, başlangıç dosyaları için POSIX standardını izler. Bu modda, etkileşimli kabuklar, ENV değişkenine ekleme yapar ve komutlar, ismi ekli değer olan dosyadan okunur ve yürütülür. Başka herhangi bir başlangıç dosyası okunmaz.

Bash, uzak kabuk arka plan programı, genellikle rshd, tarafından çalıştırıldığını belirlemeye çalışır. Eğer, Bash, rshd tarafından çalıştırıldığını belirlerse, bulunan ve okunabilirse ~/.bashrc'deki komutları okur ve yürütür. sh olarak çağrıldıysa bunu yapmayacaktır. --norc seçeneği, bu davranışı etkisiz durumuna getirmek için kullanılabilir ve --rcfile seçeneği de başka bir dosyanın okunmasını sağlamak için kullanılabilir, ama, rshd genelde kabuğu, bu seçeneklerle çağırmaz veya bu seçeneklerin belirtilmesine izin vermez.

Dış bağlantılar

Linux Documentation Project (Linux Belgelendirme Projesi)'nden Bash rehberleri:

Diğer rehber ve eğitseller: