Genel Bakış
zsh birçok özellik içerdiğinden, zsh kılavuzu bir dizi bölüme ayrılmıştır:
zsh Zsh genel bakış (bu bölüm) zshroadmap Kılavuza resmi olmayan giriş zshmisc Diğer bölümlere uymayan her şey zshexpn Zsh komut ve parametre genişletmesi zshparam Zsh parametreleri zshoptions Zsh seçenekleri zshbuiltins Zsh yerleşik işlevleri zshzle Zsh komut satırı düzenlemesi zshcompwid Zsh tamamlama bileşenleri (widget) zshcompsys Zsh tamamlama sistemi zshcompctl Zsh tamamlama denetimi zshmodules Zsh yüklenebilir modülleri zshtcpsys Zsh yerleşik TCP işlevleri zshzftpsys Zsh yerleşik FTP istemcisi zshcontrib Ek zsh işlevleri ve yardımcı araçları zshall Yukarıdakilerin tümünü içeren meta kılavuz sayfası
Açıklama
Zsh, etkileşimli bir giriş kabuğu (interactive login shell) ve bir kabuk betiği komut işlemcisi olarak kullanılabilen bir UNIX komut yorumlayıcısıdır (kabuğudur). Standart kabuklar arasında zsh en çok ksh'ye benzer ancak birçok geliştirme içerir. Varsayılan çalışma modunda POSIX veya diğer kabuklarla uyumluluk sağlamaz: aşağıdaki Compatibility (Uyumluluk) bölümüne bakın.
Zsh; komut satırı düzenleme, yerleşik yazım düzeltme, programlanabilir komut tamamlama, kabuk işlevleri (otomatik yükleme ile), geçmiş mekanizması ve daha birçok özelliğe sahiptir.
Yazar
Zsh, başlangıçta Paul Falstad tarafından yazılmıştır. Zsh'in bakımı şu anda zsh-workers e-posta listesi üyeleri zsh-workers@zsh.org tarafından sürdürülmektedir. Geliştirme çalışmaları şu anda Peter Stephenson pws@zsh.org tarafından koordine edilmektedir. Koordinatör ile coordinator@zsh.org adresinden iletişime geçilebilir, ancak kodla ilgili konular genel olarak e-posta listesine iletilmelidir.
Erişilebilirlik
Zsh, aşağıdaki HTTP ve anonim FTP sitesinden edinilebilir.
ftp://ftp.zsh.org/pub/ https://www.zsh.org/pub/
Güncel kaynak koduna Git aracılığıyla Sourceforge üzerinden erişilebilir. Ayrıntılar için https://sourceforge.net/projects/zsh/ adresine bakın. Arşiv için talimatların bir özeti https://zsh.sourceforge.io/ adresinde bulunabilir.
E-posta Listeleri
Zsh'in birkaç e-posta listesi vardır:
zsh-announce@zsh.org Sürümler, kabuktaki büyük değişiklikler ve Zsh SSS'nin (FAQ) aylık gönderimi hakkında duyurular. (moderatörlü)
zsh-users@zsh.org Kullanıcı tartışmaları.
zsh-workers@zsh.org Geliştirme çalışmaları, hata raporları ve yamalar.
zsh-security@zsh.org Güvenlik etkileri olan hata raporlarını, yani olası güvenlik açıklarını tartışmak için özel e-posta listesi (genel kamuoyu buna abone olamaz).
Zsh'in kendisinde bir güvenlik sorunu bulursanız, please mail this address.
Abone olmak veya abonelikten çıkmak için, e-posta listesinin ilgili yönetim adresine e-posta gönderin.
zsh-announce-subscribe@zsh.org zsh-users-subscribe@zsh.org zsh-workers-subscribe@zsh.org zsh-announce-unsubscribe@zsh.org zsh-users-unsubscribe@zsh.org zsh-workers-unsubscribe@zsh.org
E-POSTA LİSTELERİ İÇ İÇE GEÇMİŞ OLDUĞUNDAN YALNIZCA BİRİNE KATILMANIZ YETERLİDİR. zsh-announce listesine gönderilen tüm iletiler otomatik olarak zsh-users listesine yönlendirilir. zsh-users listesine gönderilen tüm iletiler otomatik olarak zsh-workers listesine yönlendirilir.
E-posta listelerinden herhangi birine abone olma/abonelikten çıkma konusunda sorun yaşarsanız, listmaster@zsh.org adresine e-posta gönderin.
E-posta listeleri arşivlenmektedir; arşivlere yukarıda listelenen yönetim adresleri aracılığıyla erişilebilir. Ayrıca https://www.zsh.org/mla/ adresinde bir hipermetin arşivi de mevcuttur.
Zsh SSS
Zsh'in, Peter Stephenson pws@zsh.org tarafından bakımı yapılan bir Sıkça Sorulan Sorular (SSS / FAQ) listesi vardır. Bu liste comp.unix.shell haber grubuna ve zsh-announce e-posta listesine düzenli olarak gönderilir. En son sürüm, Zsh FTP sitelerinin herhangi birinde veya https://www.zsh.org/FAQ/ adresinde bulunabilir. SSS ile ilgili konular için iletişim adresi faqmaster@zsh.org şeklindedir.
Zsh Web Sayfası
Zsh'in https://www.zsh.org/ adresinde bulunan bir web sayfası vardır. Web ile ilgili konular için iletişim adresi webmaster@zsh.org şeklindedir.
Zsh Kullanıcı Kılavuzu
Şu anda bir kullanıcı kılavuzu hazırlanmaktadır. Kılavuzun gizemli, hiyerografik veya tamamen kafa karıştırıcı olabileceği konularda (örneğin, hierographic kelimesi mevcut değildir) açıklamalar ve ipuçları sunarak kılavuzu tamamlaması amaçlanmaktadır. Kılavuzun mevcut durumu https://zsh.sourceforge.io/Guide/ adresinde görüntülenebilir. Bu yazının kaleme alındığı sırada, başlangıç dosyaları ile içerikleri ve yeni tamamlama sistemiyle ilgili bölümler esasen tamamlanmıştı.
Çağırma
Kabuk çağrıldığında, komutları nereden okuyacağını belirlemek için aşağıdaki bayrakları yorumlar:
-c: Bir betikten veya standart girdiden komut okumak yerine, ilk argümanı çalıştırılacak bir komut olarak alır. Başka argümanlar verilirse, ilki konumsal bir parametre olarak kullanılmak yerine $0 parametresine atanır.-i: Kabuğu etkileşimli olmaya zorlar. Çalıştırılacak bir betik belirtmek hala mümkündür.-s: Kabuğu standart girdiden komut okumaya zorlar. -s bayrağı mevcut değilse ve bir argüman verilmişse, ilk argüman çalıştırılacak bir betiğin yol adı (pathname) olarak kabul edilir.
Seçenek işlemeden sonra geriye kalan argümanlar varsa ve -c ya da -s seçeneklerinin hiçbiri verilmemişse, ilk argüman çalıştırılacak kabuk komutlarını içeren bir betiğin dosya adı olarak kabul edilir. Eğer PATH_SCRIPT seçeneği ayarlanmışsa ve dosya adı bir dizin yolu içermiyorsa (yani adında /' yoksa), betik için önce geçerli dizin, ardından PATH değişkeni tarafından verilen komut yolu taranır. Seçenek ayarlanmamışsa veya dosya adı bir /' içeriyorsa doğrudan kullanılır.
İlk bir veya iki argüman yukarıda açıklandığı şekilde tahsis edildikten sonra, kalan argümanlar konumsal parametrelere atanır.
Hem çağırma hem de yerleşik set komutu için ortak olan diğer seçenekler için zshoptions(1) sayfasına bakın.
Kabuğa, ardından (ayrı bir kelime olarak) bir öykünme (emulation) modu gelen uzun --emulate seçeneği geçilebilir. Öykünme modları, yerleşik emulate komutu için açıklanan modlardır, bkz. zshbuiltins(1). --emulate seçeneği diğer tüm seçeneklerden önce gelmelidir (aksi takdirde diğer seçenekler geçersiz kılınabilir), ancak sonraki seçenekler de dikkate alınır, bu nedenle talep edilen öykünme modunu değiştirmek için kullanılabilirler. Bu seçenek kullanıldığında, kabuk içindeki emulate komutuna kıyasla sorunsuz bir öykünme sağlamak için bazı ek adımların atıldığını unutmayın: örneğin, path gibi POSIX kullanımıyla çakışan değişkenler kabuk içinde tanımlanmaz.
Seçenekler, -o seçeneği kullanılarak adıyla belirtilebilir. -o seçeneği tek harfli bir seçenek gibi davranır, ancak ardından gelen dizgiyi seçenek adı olarak alır. Örneğin,
zsh -x -o shwordsplit scr
scr betiğini çalıştırır, ilgili -x harfiyle XTRACE seçeneğini ve adıyla SH_WORD_SPLIT seçeneğini ayarlar. Seçenekler, -o yerine +o kullanılarak adıyla kapatılabilir. -o, kendisinden önceki tek harfli seçeneklerle yığınlanabilir (stacked), yani örneğin -xo shwordsplit veya -xoshwordsplit, -x -o shwordsplit ifadesine eşdeğerdir.
Seçenekler ayrıca GNU uzun seçenek stilinde, --option-name şeklinde adıyla da belirtilebilir. Bu yapıldığında, seçenek adındaki - karakterlerine izin verilir: bunlar _ karakterine dönüştürülür ve böylece yok sayılır. Örneğin zsh --sh-word-split, zsh'i SH_WORD_SPLIT seçeneği açık olacak şekilde çağırır. Diğer seçenek sözdizimlerinde olduğu gibi, seçenekler baştaki - karakterini + ile değiştirerek kapatılabilir; yani +-sh-word-split, --no-sh-word-split ifadesine eşdeğerdir. Diğer seçenek sözdizimlerinin aksine, GNU stili uzun seçenekler başka seçeneklerle yığınlanamaz, bu nedenle örneğin -x-shwordsplit ifadesi, -x --shwordsplit olarak değerlendirilmek yerine bir hata verir.
Özel GNU stili --version seçeneği işlenir; kabuğun sürüm bilgisini standart çıktıya gönderir ve ardından başarıyla çıkış yapar. --help seçeneği de işlenir; kabuk çağrılırken kullanılabilecek seçeneklerin bir listesini standart çıktıya gönderir ve ardından başarıyla çıkış yapar.
Seçenek işleme iki şekilde sonlandırılabilir ve bu da - veya + ile başlayan sonraki argümanların normal argümanlar olarak ele alınmasını sağlar. İlk olarak, tek başına bir argüman olan tek bir - (veya +), seçenek işlemeyi sonlandırır. İkinci olarak, tek başına belirtilebilen (standart POSIX kullanımı budur) veya önceki seçeneklerle yığınlanabilen (böylece -x-, -x -- ifadesine eşdeğer olur) özel bir -- (veya +-) seçeneğidir. Seçeneklerin -- işaretinden sonra yığınlanmasına izin verilmez (yani -x-f bir hatadır), ancak yukarıda tartışılan ve --shwordsplit seçeneğine izin verilen ve seçenek işlemini sonlandırmayan GNU stili seçenek biçimine dikkat edin.
sh/ksh öykünmesi tek harfli seçenekleri yürürlükte olmadığı sürece, -b (veya +b) seçeneği seçenek işlemeyi sonlandırır. -b, seçenek işlemeyi sonlandırması bakımından -- gibidir, ancak -b seçeneğinden sonra başka tek harfli seçenekler yığınlanabilir ve normal şekilde geçerli olur.
Uyumluluk
Zsh, sırasıyla sh veya ksh olarak çağrıldığında sh veya ksh'yi öykünmeye (emulate) çalışır; daha kesin bir ifadeyle, çağrıldığı adın ilk harfine bakar (baştaki r harfi 'restricted' (kısıtlı) anlamına geldiği varsayılarak hariç tutulur) ve bu harf b, s veya k ise sh ya da ksh'yi öykünür. Dahası, su olarak çağrılırsa (kabuk su komutu tarafından yürütüldüğünde bazı sistemlerde bu gerçekleşir), kabuk SHELL çevre değişkeninden alternatif bir ad bulmaya çalışır ve buna göre öykünme gerçekleştirir.
sh ve ksh uyumluluk modlarında aşağıdaki parametreler özel değildir ve kabuk tarafından başlatılmaz: ARGC, argv, cdpath, fignore, fpath, HISTCHARS, mailpath, MANPATH, manpath, path, prompt, PROMPT, PROMPT2, PROMPT3, PROMPT4, psvar, status.
Alışılagelmiş zsh başlangıç/kapanış betikleri yürütülmez. Giriş kabukları (login shells) /etc/profile dosyasını ve ardından $HOME/.profile dosyasını okur (source). Çağırma sırasında ENV çevre değişkeni ayarlanmışsa, profil betiklerinden sonra $ENV okunur. ENV değeri, bir yol adı olarak yorumlanmadan önce parametre genişletmesine, komut ikamesine (command substitution) ve aritmetik genişletmeye tabi tutulur. PRIVILEGED seçeneğinin başlangıç dosyalarının yürütülmesini de etkilediğini unutmayın.
Kabuk sh veya ksh olarak çağrılırsa aşağıdaki seçenekler ayarlanır: NO_BAD_PATTERN, NO_BANG_HIST, NO_BG_NICE, NO_EQUALS, NO_FUNCTION_ARGZERO, GLOB_SUBST, NO_GLOBAL_EXPORT, NO_HUP, INTERACTIVE_COMMENTS, KSH_ARRAYS, NO_MULTIOS, NO_NOMATCH, NO_NOTIFY, POSIX_BUILTINS, NO_PROMPT_PERCENT, RM_STAR_SILENT, SH_FILE_EXPANSION, SH_GLOB, SH_OPTION_LETTERS, SH_WORD_SPLIT. Ek olarak, zsh sh olarak çağrılırsa BSD_ECHO ve IGNORE_BRACES seçenekleri ayarlanır. Ayrıca, zsh ksh olarak çağrılırsa KSH_OPTION_PRINT, LOCAL_OPTIONS, PROMPT_BANG, PROMPT_SUBST ve SINGLE_LINE_ZLE seçenekleri ayarlanır.
Uyumsuzluklar ortaya çıktığında bunları gidermek için makul çaba gösterilse de, zsh'in diğer kabukların tam bir öykünmesini veya POSIX uyumluluğunu garanti etmediğini lütfen unutmayın. Zsh ile diğer kabuklar arasındaki farklar hakkında daha fazla bilgi için lütfen kabuk SSS'sinin 2. bölümüne bakın: https://www.zsh.org/FAQ/.
Kısıtlı Kabuk (Restricted Shell)
zsh'i çağırmak için kullanılan komutun temel adı (basename) r harfiyle başladığında veya çağırma sırasında -r komut satırı seçeneği sağlandığında, kabuk kısıtlı hale gelir. Öykünme modu, çağırma adından r harfi çıkarıldıktan sonra belirlenir. Kısıtlı modda aşağıdakiler devre dışı bırakılır:
• yerleşik cd komutuyla dizin değiştirmek
• EGID, EUID, GID, HISTFILE, HISTSIZE, IFS, LD_AOUT_LIBRARY_PATH, LD_AOUT_PRELOAD, LD_LIBRARY_PATH, LD_PRELOAD, MODULE_PATH, module_path, PATH, path, SHELL, UID ve USERNAME parametrelerini değiştirmek veya kaldırmak (unset)
• / içeren komut adları belirtmek
• hash kullanarak komut yol adları belirtmek
• çıktıyı dosyalara yönlendirmek
• kabuğu başka bir komutla değiştirmek için yerleşik exec komutunu kullanmak
• kabuk işleminin argüman ve çevre alanını üzerine yazmak için jobs -Z kullanmak
• harici komutlar için argv[0] değerini geçersiz kılmak amacıyla ARGV0 parametresini kullanmak
• set +r veya unsetopt RESTRICTED ile kısıtlı modu kapatmak
Bu kısıtlamalar, başlangıç dosyaları işlendikten sonra uygulanır. Başlangıç dosyaları, PATH değişkenini kısıtlı ortamda güvenle çağrılabilecek komutların bulunduğu bir dizine işaret edecek şekilde ayarlamalıdır. Ayrıca seçilen yerleşik komutları devre dışı bırakarak daha fazla kısıtlama ekleyebilirler.
Kısıtlı mod, RESTRICTED seçeneği ayarlanarak herhangi bir zamanda da etkinleştirilebilir. Bu, kabuk henüz tüm başlangıç dosyalarını işlememiş olsa bile yukarıda açıklanan tüm kısıtlamaları derhal etkinleştirir.
Kısıtlı Kabuk Modu, kullanıcıların neler yapabileceğini kısıtlamanın modası geçmiş bir yoludur: modern sistemler, chroot hapishaneleri (jails), konteynerler ve bölgeler (zones) gibi kullanıcı eylemlerini sınırlandırmak için daha iyi, daha güvenli ve daha güvenilir yollara sahiptir.
Kısıtlı bir kabuğu güvenli bir şekilde uygulamak oldukça zordur. Bu özellik zsh'in gelecekteki bir sürümünde kaldırılabilir.
Kısıtlamaların (bazı yerleşik kabuk komutları hariç) yalnızca kabuk için geçerli olduğunu, çalıştırdığı komutlar için geçerli olmadığını anlamak önemlidir. Kısıtli bir kabuk yalnızca önceden tanımlanmış PATH değişkeni aracılığıyla erişilebilen kısıtlı komut listesini çalıştırabilse de, bu komutların başka herhangi bir komutu çalıştırmasını engellemez.
Bir örnek olarak, izin verilen komutlar listesinde env varsa, env bir yerleşik kabuk komutu olmadığından ve keyfi yürütülebilir dosyaları çalıştırabildiğinden, kullanıcının herhangi bir komutu çalıştırmasına izin verir.
Bu nedenle, kısıtlı bir kabuk çerçevesi uygularken, izin verilen her bir komutun veya özelliğin (ki bunlar modül olarak kabul edilebilir) hangi eylemleri gerçekleştirebileceğinin tam olarak farkında olmak önemlidir.
Birçok komutun davranışı çevre değişkenlerinden etkilenebilir. Yukarıda listelenen birkaç tanesi hariç, zsh çevre değişkenlerinin ayarlanmasını kısıtlamaz.
Eğer perl, python, bash veya diğer genel amaçlı yorumlanan betikler kısıtlı bir komut olarak değerlendirilirse, kullanıcı özel olarak hazırlanmış PERL5LIB, PYTHONPATH, BASH_ENV (vb.) çevre değişkenlerini ayarlayarak kısıtlamayı aşabilir. GNU sistemlerinde, GCONV_PATH çevre değişkeni ayarlanarak karakter seti dönüştürmesi gerçekleştirirken herhangi bir komutun (zsh'in kendisi dahil) keyfi kod çalıştırması sağlanabilir. Bunlar sadece birkaç örnektir.
Bazı diğer kabukların aksine, zsh'te readonly özelliğinin geri alınabileceği için bir güvenlik özelliği olmadığını ve bu nedenle yukarıdakileri hafifletmek için kullanılamayacağını unutmayın.
Kısıtlı bir kabuk, yalnızca izin verilen komutlar az sayıda olduğunda ve kullanıcılara amaçlanandan daha fazla erişim hakkı tanımayacak şekilde dikkatlice yazıldığında işe yarar. Kullanıcının hangi zsh modüllerini yükleyebileceğini kısıtlamak da önemlidir, çünkü zsh/system, zsh/mapfile ve zsh/files gibi bazı modüller kısıtlamaların çoğunun aşılmasına izin verir.
Başlangıç/Kapanış Dosyaları
Komutlar ilk olarak /etc/zshenv dosyasından okunur; bu geçersiz kılınamaz. Sonraki davranışlar RCS ve GLOBAL_RCS seçenekleri tarafından değiştirilir; ilki tüm başlangıç dosyalarını etkilerken, ikincisi yalnızca genel başlangıç dosyalarını (burada yolu / ile başlayanlar) etkiler. Seçeneklerden biri herhangi bir noktada kaldırılırsa (unset), ilgili türdeki sonraki başlangıç dosyaları okunmayacaktır. $ZDOTDIR içindeki bir dosyanın GLOBAL_RCS seçeneğini yeniden etkinleştirmesi de mümkündür. Hem RCS hem de GLOBAL_RCS varsayılan olarak ayarlıdır.
Komutlar daha sonra $ZDOTDIR/.zshenv dosyasından okunur. Eğer kabuk bir giriş kabuğu ise komutlar sırasıyla /etc/zprofile ve ardından $ZDOTDIR/.zprofile dosyalarından okunur. Daha sonra kabuk etkileşimli ise komutlar /etc/zshrc ve ardından $ZDOTDIR/.zshrc dosyalarından okunur. Son olarak kabuk bir giriş kabuğu ise /etc/zlogin and $ZDOTDIR/.zlogin okunur.
Bir giriş kabuğundan çıkıldığında, sırasıyla $ZDOTDIR/.zlogout ve ardından /etc/zlogout dosyaları okunur. Bu durum, exit veya logout komutları aracılığıyla açık bir çıkışla ya da terminalden dosya sonu (end-of-file) okunarak yapılan örtük bir çıkışla gerçekleşir. Ancak kabuk başka bir işlemi exec ettiği için sonlanırsa, çıkış (logout) dosyaları okunmaz. Bunlar da RCS ve GLOBAL_RCS seçeneklerinden etkilenir. Ayrıca RCS seçeneğinin geçmiş dosyalarının kaydedilmesini de etkilediğini unutmayın, yani kabuktan çıkıldığında RCS ayarlanmamışsa hiçbir geçmiş dosyası kaydedilmeyecektir.
ZDOTDIR ayarlanmamışsa bunun yerine HOME kullanılır. Yukarıda /etc dizininde olduğu belirtilen dosyalar kuruluma bağlı olarak başka bir dizinde bulunabilir.
/etc/zshenv dosyası tüm zsh örnekleri için çalıştırıldığından, mümkün olduğunca küçük tutulması önemlidir. Özellikle her kabuk için çalıştırılması gerekmeyen kodları if [[ -o rcs ]]; then ...' biçimindeki bir testin arkasına koymak iyi bir fikirdir; böylece zsh -f' seçeneğiyle çağrıldığında bu kodlar yürütülmeyecektir.
Bu dosyalardan herhangi biri yerleşik zcompile komutuyla önceden derlenebilir (bkz. zshbuiltins(1)). Derlenmiş bir dosya mevcutsa (orijinal dosyanın adına .zwc uzantısı eklenerek adlandırılır) ve orijinal dosyadan daha yeniyse bunun yerine derlenmiş dosya kullanılacaktır.
Dosyalar
$ZDOTDIR/.zshenv $ZDOTDIR/.zprofile $ZDOTDIR/.zshrc $ZDOTDIR/.zlogin $ZDOTDIR/.zlogout ${TMPPREFIX}* (varsayılanı /tmp/zsh* 'tır) /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout (kuruluma özel - varsayılanı /etc'dir)
Ayrıca Bakınız
sh(1), csh(1), tcsh(1), rc(1), bash(1), ksh(1), zshall(1), zshbuiltins(1), zshcompwid(1), zshcompsys(1), zshcompctl(1), zshcontrib(1), zshexpn(1), zshmisc(1), zshmodules(1), zshoptions(1), zshparam(1), zshroadmap(1), zshtcpsys(1), zshzftpsys(1), zshzle(1)
IEEE Standard for information Technology - Portable Operating System Interface (POSIX) - Part 2: Shell and Utilities, IEEE Inc, 1993, ISBN 1-55937-255-9.
zsh 5.9 14 Mayıs 2022 ZSH(1)