| Yazar | AT&T Corporation (Orijinal sürüm, Bourne shell) |
|---|---|
| Geliştirici | Çeşitli açık kaynaklı (örn. GNU Projesi) ve ticari geliştiriciler |
| İlk yayınlanma | 1984) |
| İşletim sistemi | Unix ve Unix-benzeri işletim sistemleri |
| Platform | Çoklu platform |
| Tür | Komut (Kabuk yerleşiği) |
| Lisans | Bulunduğu kabuk programına bağlı (Örn: GNU Bash için GPL) |
type, Unix ve Unix-benzeri işletim sistemlerinde kullanıcı tarafından girilen bir komut satırı argümanının kabuk (shell) tarafından tam olarak nasıl yorumlanacağını ve çalıştırılacağını detaylandıran bir kabuk yerleşiğidir (İng. shell builtin).
Özellikle sistem yöneticileri, yazılım geliştiriciler ve terminal kullanıcıları tarafından; çalıştırılmak istenen bir komutun bir takma ad (alias) mı, kabuğun kendi iç fonksiyonu mu, rezerve edilmiş bir anahtar kelime mi, yoksa diskte bulunan harici bir çalıştırılabilir dosya (binary) mı olduğunu kesin olarak tespit etmek amacıyla yaygın olarak kullanılır.
Unix benzeri sistemlerde bir kullanıcı terminale bir komut (örneğin ls veya cd) yazdığında, kabuk bu komutu rastgele aramaz. Belirli ve katı bir öncelik sırası takip edilir. Bu hiyerarşi genellikle şöyledir:
if, for)cd, pwd)$PATH çevre değişkeni (environment variable) içinde listelenen dizinlerdeki çalıştırılabilir dosyalar.type komutu, kullanıcının girdiği kelimenin bu hiyerarşide nereye düştüğünü söyler.
Neden bir kabuk yerleşiğidir?
type komutunun bağımsız, harici bir çalıştırılabilir dosya (örneğin /usr/bin/type) olması mimari olarak imkansızdır. Unix sistemlerinde harici programlar fork() ve execve() sistem çağrılarıyla bir alt süreç (child process) olarak başlatılırlar. Bir alt süreç, kendisini başlatan ebeveyn kabuğun (parent shell) iç belleğine erişemez. Dolayısıyla harici bir program, kullanıcının o anki oturumunda tanımladığı geçici takma adları (alias) veya yazılımsal fonksiyonları göremez. type'ın tüm bu kabuk içi verileri okuyabilmesi için mutlaka kabuğun kendi kaynak kodunun bir parçası (yerleşik/builtin) olması gerekir.
type komutunun yetenekleri kullanılan kabuğa (sh, Bash, zsh, ksh) göre farklılık gösterse de, en yaygın ve varsayılan olarak kabul edilen GNU Bash kabuğunda genel sözdizimi şu şekildedir:
type [-afptP] [komut_adı ...]
Bash ortamında sık kullanılan parametreler şunlardır:
-t (type): Komutun uzun açıklaması yerine yalnızca türünü belirten tek bir kategorik kelime döndürür. Olası çıktılar: alias, keyword, function, builtin, veya file şeklindedir. Komut bulunamazsa terminale hiçbir şey yazdırmaz.-p (path): Eğer sorgulanan komut diskte gerçekten bir dosya ise (türü file ise), dosyanın tam disk yolunu yazdırır. Eğer komut bir alias veya yerleşik komut ise (dosya değilse) sessiz kalır.-P (force path): Sorgulanan komut bir alias veya fonksiyon olsa bile, o isme sahip harici bir çalıştırılabilir dosyanın diskteki yolunu bulmaya zorlar.-a (all): Verilen komut adıyla eşleşen tüm olasılıkları hiyerarşik sırayla listeler. Örneğin, hem bir echo kabuk yerleşiği hem de /usr/bin/echo dosyası varsa, her ikisini de çıktı olarak verir.-f: Komut aranırken kabuk fonksiyonlarını kasten göz ardı eder (bypass).Aşağıda modern bir Linux terminalinde standart çıktıları gösteren durumlar yer almaktadır:
1. Temel tür sorgulamaları:
$ type test
test is a shell builtin
$ type cp
cp is /bin/cp
$ type ls
ls is aliased to `ls --color=auto'
$ type for
for is a shell keyword
2. Parametrelerin kombine kullanımı (Bash ortamı):
$ type -t ls
alias
$ type -p cp
/bin/cp
$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo
3. Fonksiyon kaynak kodunun görüntülenmesi:
Eğer bellekte tanımlı bir bash fonksiyonu varsa, type komutu parametresiz kullanıldığında o fonksiyonun tüm kaynak kodunu (body) ekrana basar. Bu özellik betiklerde hata ayıklamak için çok değerlidir.
$ function merhaba_de() { echo "Merhaba Dünya!"; }
$ type merhaba_de
merhaba_de is a function
merhaba_de ()
{
echo "Merhaba Dünya!"
}
Sistem yöneticileri ve otomasyon betiği (script) yazarları, bir programın sistemde yüklü olup olmadığını denetlemek için type komutunun çıkış durumundan (Exit status) faydalanırlar.
Bu özellik, betiklerin çalışmadan önce gerekli bağımlılıkları (dependencies) kontrol etmesini sağlar:
#!/bin/bash
# curl komutunun sistemde yüklü olup olmadığını kontrol et
if type curl > /dev/null 2>&1; then
echo "curl komutu bulundu, indirme işlemi başlatılıyor..."
# curl ile ilgili işlemler burada yapılır
else
echo "Hata: curl sistemde yüklü değil! Lütfen yükleyin."
exit 1
fi
> /dev/null 2>&1 kısmı, type komutunun ekrana yazı yazdırmasını engelleyip sadece arka plandaki matematiksel çıkış kodunu kullanmak için standart bir Unix yönlendirme tekniğidir).*type komutu son derece popüler olmasına rağmen, resmi POSIX standartlarının (IEEE Std 1003.1) bir parçası değildir. POSIX uyumlu taşınabilir bir betik yazılırken, type yerine birebir aynı işi standartlara uygun yapan command -v (sadece yol veya isim) veya command -V (ayrıntılı açıklama) kullanılması şiddetle önerilir.
Örneğin, Debian ve Ubuntu sistemlerinde varsayılan sistem kabuğu olan minimal dash kabuğunda type komutu vardır, ancak çok temel seviyededir; -a veya -t gibi gelişmiş Bash parametrelerini desteklemez.
type komutunu yerleşik olarak barındırır ancak mimari olarak type, arka planda whence -v komutuna bağlanmış bir takma addır. Gelişmiş arama yeteneklerine sahiptir.whence yerleşiği ile yapılır. type komutu sadece whence -v olarak tanımlanmış bir alias'tır.MS-DOS, OS/2 ve Windows Komut İstemi'nde (cmd.exe), type isimli tamamen farklı bir yerleşik komut bulunmaktadır. Windows'taki type komutu, metin dosyalarının içeriğini ekrana yazdırmak için kullanılır ve Unix dünyasındaki cat komutunun muadilidir. Unix kökenli kullanıcıların Windows'a, Windows kökenli kullanıcıların Linux'a geçişlerinde bu isim benzerliği en sık karşılaşılan kafa karışıklıklarından biridir.
Bununla birlikte, yaygın GNU Unix-benzeri hizmet programlarının yerel Win32 portlarını içeren UnxUtils veya Cygwin koleksiyonları kullanılarak Unix benzeri type davranışı Windows'a da kazandırılabilmektedir. Modern Windows PowerShell ortamında ise type, dosyaları okumak için kullanılan Get-Content cmdlet'inin tanımlı bir alias'ı (takma adı) olarak işlev görür.
which: type komutuna bilinen en yaygın alternatiftir. Ancak which bir kabuk yerleşiği değil, harici bir programdır. Yalnızca $PATH değişkenindeki dizinlerde dosya araması yapar. Kabuk fonksiyonlarını, takma adları veya yerleşikleri göremez. Bu nedenle sistem yöneticileri komut çözümlemesinde which yerine type kullanımını daha güvenilir kabul eder.whereis: Komutların sadece çalıştırılabilir dosyalarını değil, kaynak kodlarını (source) ve kullanım kılavuzu (man page) dosyalarını da sistemde bulmak için tasarlanmıştır.hash: Kabuğun, daha önce çalıştırılmış komutların yerini hızlıca bulmak için kullandığı iç bellek tablosunu (hash table) görüntüler. type komutu "hashed" (belleğe alınmış) bir komutu da tespit edebilir.command -v: type komutunun POSIX standartlarındaki resmi karşılığıdır.type komutu, bilgisayar tarihine ilk kez orijinal Bourne kabuğu (sh) için bir kabuk yerleşiği olarak 1984 yılında, AT&T'nin System V Release 2 (SVR2) işletim sistemi sürümü ile birlikte girmiştir. O dönemde bilgisayar sistemlerinin mimarisi giderek karmaşıklaşıyor ve kullanıcıların yazdıkları komutun tam olarak nereden çalıştığını bilmemesi güvenlik ve hata ayıklama (debugging) sorunlarına yol açıyordu. type, bu sorunu çözmek için eklendi. Günümüzde Bash, Zsh ve diğer birçok popüler Unix kabuğunda varsayılan bir özellik olarak geliştirilerek varlığını sürdürmektedir.
whence [...] Korn shell only. Show whether each command is a Unix command, a built-in command, a defined shell function, or an alias.