Kabuk betiği - Shell script

Bir düzenleme FreeBSD yapılandırma için kabuk komut dosyası ipfirewall

Bir kabuk komut dosyası bir bilgisayar programı tarafından çalıştırılmak üzere tasarlanmış Unix kabuğu, bir komut satırı yorumlayıcısı.[1] Kabuk betiklerinin çeşitli lehçeleri, komut dosyası dilleri. Kabuk betikleri tarafından gerçekleştirilen tipik işlemler arasında dosya işleme, program yürütme ve metin yazdırma yer alır. Ortamı kuran, programı çalıştıran ve gerekli herhangi bir temizleme, günlük kaydı vb. Yapan bir betik, sarıcı.

Terim ayrıca daha genel olarak bir işletim sistemi kabuğunu çalıştırmanın otomatikleştirilmiş modu anlamında kullanılır; belirli işletim sistemlerinde toplu iş dosyaları gibi başka şeyler olarak adlandırılırlar (MSDos-Win95 akışı, OS / 2 ), komut prosedürleri (VMS) ve kabuk komut dosyaları (Windows NT akış ve benzeri üçüncü taraf türevleri 4SA - makale cmd.exe ) ve ana bilgisayar işletim sistemleri bir dizi terimle ilişkilendirilir.

Tipik Unix / Linux / POSIX uyumlu kurulum şunları içerir: KornShell (ksh) ksh88, Korn Shell '93 ve diğerleri gibi birkaç olası sürümde. Halen yaygın olarak kullanılan en eski kabuk, Bourne kabuğu (sh); Unix sistemleri her zaman aşağıdakileri de içerir: C kabuğu (csh), Bash (bash), bir Uzak Kabuk (rsh), bir Güvenli Kabuk (ssh) için SSL telnet bağlantılar ve ana bileşen olan bir kabuk Tcl / Tk kurulum genellikle denir tclsh; dilek GUI tabanlı bir Tcl / Tk kabuğudur. C ve Tcl kabukları, söz konusu programlama dillerindekine oldukça benzer bir sözdizimine sahiptir ve Korn kabukları ve Bash, Bourne kabuğunun geliştirmeleridir. Algol bir dizi başka unsurun da eklendiği dil.[2] Öte yandan, çeşitli kabuklar ve aşağıdaki gibi araçlar awk, sed, grep, ve TEMEL, Lisp, C ve diğerleri katkıda bulundu Perl Programlama dili.[3]

Bir makinede bulunan veya indirilebilen ve / veya satın alınabilen diğer mermiler şunları içerir: Almquist kabuğu (kül), Güç kalkanı (msh), Z kabuğu (zsh, özellikle yaygın olarak geliştirilmiş bir KornShell), Tenex C Kabuğu (tcsh), Perl benzeri bir kabuk (psh). Mermi gibi ilgili programlar Python, Yakut, C, Java, Perl, Pascal, Rexx & c çeşitli biçimlerde de yaygın olarak mevcuttur. Biraz yaygın olan başka bir kabuk ise osh, kılavuz sayfasında "Altıncı Sürüm UNIX'in standart komut yorumlayıcısının gelişmiş, geriye dönük uyumlu bir bağlantı noktasıdır."[4]

Windows-Unix birlikte çalışabilirlik yazılımı, örneğin MKS Araç Seti, Cygwin, SEN KAZANDIN, Interix ve diğerleri, yukarıdaki kabukları ve Unix programlamayı Windows sistemlerinde kullanılabilir hale getirerek, sinyallere ve diğer arası iletişim, sistem çağrıları ve API'ler. Hamilton C kabuğu Unix C Kabuğuna çok benzeyen bir Windows kabuğudur. Microsoft dağıtıldı UNIX için Windows Hizmetleri Özellikle bir POSIX'e sahip olan NT tabanlı işletim sistemleriyle kullanım için çevresel alt sistem.

Yetenekler

Yorumlar

Yorumlar kabuk tarafından dikkate alınmaz. Genellikle hash simgesiyle başlarlar (#) ve hattın sonuna kadar devam edin.[5]

Yapılandırılabilir komut dosyası dili seçimi

shebang veya hash-bang, sistemin dosyayı yürütmek için hangi yorumlayıcının kullanılacağını belirlemek için kullandığı özel bir yorum türüdür. Shebang dosyanın ilk satırı olmalı ve "#!".[5] Unix benzeri işletim sistemlerinde, "#!"önek, komut dosyasını yorumlayacak yürütülebilir bir programa giden yol olarak yorumlanır.[6]

Kısayollar

Bir kabuk betiği, özel ortam ayarlarının, komut seçeneklerinin veya sonradan işlemenin otomatik olarak uygulandığı, ancak yeni betiğin hala tamamen normal bir Unix komutu gibi davranmasına izin veren bir sistem komutunun kullanışlı bir varyasyonunu sağlayabilir.

Bir örnek, bir sürümünü oluşturmaktır. ls, dosyaları listeleme komutu, daha kısa bir komut adı vererek l, normalde bir kullanıcının çöp Kutusu dizin olarak /ev/Kullanıcı adı/ bin / lve önceden sağlanan varsayılan komut seçenekleri kümesi.

#! / bin / shLC_COLLATE=C ls -FCas "$@"

Burada, ilk satır bir shebang komut dosyasının geri kalanını hangi yorumlayıcının yürütmesi gerektiğini belirtmek için ve ikinci satır dosya formatı göstergeleri, sütunlar, tüm dosyalar (hiçbiri ihmal edilmemiş) ve bloklar halinde bir boyut için seçenekler içeren bir liste yapar. LC_COLLATE = C varsayılan harmanlama sırasını büyük ve küçük harfleri birlikte katlamayacak şekilde ayarlar, karıştırmayı değil dotfiles adlardaki noktalama işaretlerini göz ardı etmenin bir yan etkisi olarak normal dosya adlarıyla (nokta dosyaları genellikle yalnızca -a kullanılır) ve "$@" herhangi bir parametreye neden olur l parametre olarak ls'ye geçmek, böylece tüm normal seçenekler ve diğer sözdizimi ls tarafından bilinen hala kullanılabilir.

Kullanıcı daha sonra basitçe kullanabilir l en sık kullanılan kısa liste için.

Kısayol olarak kullanılabilecek başka bir kabuk komut dosyası örneği, belirli bir dizindeki tüm dosyaların ve dizinlerin bir listesini yazdırmak olabilir.

#! / bin / shclearls -al

Bu durumda, kabuk betiği normal başlangıç ​​satırı ile başlar. #! / bin / sh. Bunu takiben, komut dosyası şu komutu yürütür: açık Bu, sonraki satıra geçmeden önce tüm metnin sonunu temizler. Aşağıdaki satır, komut dosyasının ana işlevini sağlar. ls -al command komut dosyasının çalıştırıldığı dizindeki dosyaları ve dizinleri listeler. ls komut öznitelikleri, kullanıcının ihtiyaçlarını yansıtacak şekilde değiştirilebilir.

Not: Bir uygulamada, açık komutunu kullanmayı deneyin clr bunun yerine komut.

Toplu işler

Kabuk komut dosyaları, bir komut satırı arayüzüne manuel olarak girilen birkaç komutun otomatik olarak ve bir kullanıcının dizinin her aşamasını tetiklemesini beklemesine gerek kalmadan yürütülmesine izin verir. Örneğin, üç C kaynak kodu dosyası içeren bir dizinde, son programı onlardan oluşturmak için gereken dört komutu manuel olarak çalıştırmak yerine, bunun yerine bir komut dosyası oluşturulabilir. POSIX uyumlu mermiler, burada adlandırılır inşa etmek ve onlarla birlikte dizinde tutulur, bu da onları otomatik olarak derler:

#! / bin / shprintf 'derleniyor ...  n'cc -c foo.ccc -c bar.ccc -c qux.ccc -o myprog foo.o bar.o qux.oprintf "bitti.  n"

Komut dosyası, kullanıcının düzenlenmekte olan dosyayı kaydetmesine, düzenleyiciyi duraklatmasına ve ardından ./inşa etmek güncellenmiş programı oluşturmak için, test edin ve ardından editöre geri dönün. Bununla birlikte, 1980'lerden bu yana, bu türden komut dosyaları, aşağıdaki gibi yardımcı programlarla değiştirildi Yapmak programlar oluşturmak için uzmanlaşmıştır.

Genelleme

Basit toplu işler, yalıtılmış görevler için alışılmadık değildir, ancak kabuk döngüleri, testler ve değişkenler kullanmak, kullanıcılara çok daha fazla esneklik sağlar. JPEG görüntülerini PNG görüntülerine dönüştürmek için bir POSIX sh betiği, görüntü adlarının komut satırında (muhtemelen joker karakterlerle), her biri komut dosyası içinde listelenmesi yerine, sağlandığı bu dosya ile oluşturulabilir, tipik olarak aşağıdaki gibi bir dosyaya kaydedilebilir /ev/Kullanıcı adı/ bin / jpg2png

#! / bin / shiçin jpg; yapmak                                  # sırayla verilen her dosya adı yerine $ jpg kullanın    png=${jpg% .jpg}.png # .jpg'yi .png ile değiştirerek dosya adının PNG sürümünü oluşturun    printf "% s" dönüştürülüyor ...  n ' "$ jpg"    # komut dosyasını çalıştıran kullanıcıya durum bilgisi çıktı    Eğer dönüştürmek "$ jpg" jpg.to.png; sonra       # PNG'yi geçici bir dosyada oluşturmak için convert (ImageMagick tarafından sağlanır) kullanın        mv jpg.to.png "$ png"                 # işe yaradıysa, geçici PNG görüntüsünü doğru adla yeniden adlandırın    Başka                                     # ... aksi takdirde şikayet edin ve komut dosyasından çıkın        printf >&2 'jpg2png: hata: başarısız çıktı "jpg.to.png" içine kaydedildi.  n'        çıkış 1    fi                                       # "if" test yapısının sonubitti                                         # "for" döngüsünün sonuprintf "tüm dönüşümler başarılı  n"        # kullanıcıya iyi haberi söyleyin

jpg2png komutu daha sonra JPEG görüntülerle dolu bir dizinin tamamında çalıştırılabilir. /ev/Kullanıcı adı/ bin / jpg2png * .jpg

Doğruluk

Kabuk komut dosyalarının temel bir özelliği, yorumlayıcılarının başlatılmasının temel bir işletim sistemi özelliği olarak ele alınmasıdır. Bu nedenle, bir kullanıcının kabuğunun yalnızca o kabuğun dilinde komut dosyalarını çalıştırabilmesi veya yalnızca tercüman direktifi bir kabuktan çalıştırıldıysa (her ikisi de erken Bourne kabuğunun komut dosyalarını işlemesinde sınırlamalardı), kabuk komut dosyaları işletim sisteminin kendisi tarafından kurulur ve yürütülür. Modern bir kabuk betiği, yalnızca sistem komutlarıyla aynı temelde değildir, daha çok sistem komutları aslında kabuk betikleri (veya daha genel olarak, betikler, çünkü bazıları bir kabuk tarafından yorumlanmıyor, bunun yerine Perl, Python veya başka bir dil). Bu, başarı veya başarısızlığı belirtmek için diğer sistem yardımcı programları gibi geri dönen çıkış kodlarına kadar uzanır ve bu daha büyük araçların nasıl uygulandığına bakılmaksızın bunların daha büyük programların bileşenleri olarak adlandırılmasına izin verir.[7][8]

Standart sistem komutları gibi, kabuk komut dosyaları, bu amaç için özel bir mekanizma aracılığıyla çalışan bir kabuğa okunması amaçlanmadıkça klasik olarak herhangi bir dosya adı uzantısını atlar (örneğin sh’S". "veya csh’S kaynak).[9][10]

Programlama

Birçok modern kabuk, genellikle yalnızca daha karmaşık genel amaçlı programlama dilleri kontrol akışı yapıları, değişkenler gibi yorumlar diziler alt programlar ve benzeri. Mevcut bu tür özelliklerle, oldukça karmaşık uygulamaları kabuk komut dosyaları olarak yazmak mümkündür. Bununla birlikte, çoğu kabuk dilinin veri tipleme sistemleri, sınıflar, iş parçacığı, karmaşık matematik ve diğer yaygın tam dil özellikleri için çok az desteğe sahip olması veya hiç desteği olmaması ve ayrıca genellikle derlenmiş koddan veya yazılmış yorumlanmış dillerden çok daha yavaştır. performans hedefi olarak hız ile.

Standart Unix araçları sed ve awk kabuk programlama için ekstra yetenekler sağlar; Perl diğer betik dilleri gibi kabuk betiklerine de gömülebilir. Tcl. Perl ve Tcl, grafik araç takımlarıyla birlikte gelir.

Diğer betik dilleri

Sıradan kabuk komut dosyalarıyla rahatça ele alınamayacak kadar büyük veya karmaşık olan, ancak bir komut dosyasının avantajlarının arzu edildiği ve tam gelişmiş, derlenmiş bir programlama dilinin geliştirme ek yükünün dezavantajlı olacağı görevler için birçok güçlü komut dosyası dili tanıtılmıştır. . Komut dosyası dillerini ayıran özelliklerin özellikleri üst düzey programlama dilleri sıkça tartışılan bir kaynaktır, ancak genel olarak konuşursak, bir betik dili tercüman gerektiren bir dildir.

Yaşam döngüsü

Kabuk komut dosyaları genellikle yazılım geliştirmede bir başlangıç ​​aşaması olarak hizmet eder ve genellikle daha sonra farklı bir temel uygulamaya dönüştürülür, çoğunlukla Perl, Python veya C. tercüman direktifi uygulama ayrıntısının bir dosya adı uzantısı olarak gösterilmek yerine komut dosyası içinde tamamen gizlenmesine izin verir ve son kullanıcılar üzerinde hiçbir etkisi olmadan farklı dillerde sorunsuz yeniden uygulama sağlar.

".Sh" içeren dosyalar Dosya uzantısı genellikle bir tür kabuk betiğidir, çoğu kabuk betiğinin herhangi bir dosya adı uzantısı yoktur.[11][12]

Avantajlar ve dezavantajlar

Bir kabuk komut dosyası yazmanın belki de en büyük avantajı, komutların ve sözdiziminin doğrudan komut satırına girilenlerle tamamen aynı olmasıdır. Programcı, komut dosyası farklı bir dilde yazılmışsa veya derlenmiş bir dil kullanılmışsa, tamamen farklı bir sözdizimine geçmek zorunda değildir.

Genellikle, bir kabuk komut dosyası yazmak, diğer programlama dillerindeki eşdeğer kodu yazmaktan çok daha hızlıdır. Birçok avantaj, kolay program veya dosya seçimi, hızlı başlatma ve etkileşimli hata ayıklamayı içerir. Mevcut programlar etrafında bir sıralama ve karar verme bağlantısı sağlamak için bir kabuk komut dosyası kullanılabilir ve orta büyüklükteki komut dosyaları için bir derleme adımının olmaması bir avantajdır. Yorumlayıcı çalıştırma, hata ayıklama kodunu bir komut dosyasına yazmayı ve hataları algılamak ve düzeltmek için yeniden çalıştırmayı kolaylaştırır. Uzman olmayan kullanıcılar, programların davranışını uyarlamak için komut dosyası kullanabilir ve kabuk komut dosyası, çoklu işlem için bazı sınırlı kapsam sağlar.

Öte yandan, kabuk komut dosyası oluşturma maliyetli hatalara eğilimlidir. Yanlışlıkla yazım hataları, örneğin rm -rf * / (amaçlanan yerine rm -rf * /) Unix topluluğundaki folklor; tek bir fazladan boşluk, komutu alt dizinlerdeki her şeyi silen bir komuttan, her şeyi silen bir komuta dönüştürür ve aynı zamanda içindeki her şeyi silmeye çalışır. kök dizini. Benzer sorunlar dönüşebilir cp ve mv tehlikeli silahlara ve kötüye kullanıma > redirect bir dosyanın içeriğini silebilir. Bu, birçok UNIX komutunun adlarının yalnızca bir harfle farklı olması gerçeğiyle daha sorunlu hale gelir: cp, CD, gg, df, vb.

Diğer bir önemli dezavantaj, yavaş yürütme hızı ve yürütülen hemen hemen her kabuk komutu için yeni bir işlem başlatma ihtiyacıdır. Bir komut dosyasının işi, bir komut dosyası kurarak gerçekleştirilebilir. boru hattı hangi verimli filtre komutlar işin çoğunu gerçekleştirir, yavaşlama hafifletilir, ancak karmaşık bir komut dosyası tipik olarak eşdeğer bir görevi gerçekleştiren geleneksel bir derlenmiş programdan birkaç kat daha yavaştır.

Farklı platformlar arasında uyumluluk sorunları da var. Larry Duvarı, yaratıcısı Perl, "Bir kabuğu taşımak, kabuk betiğinden daha kolaydır."[Bu alıntı bir alıntıya ihtiyaç duyar ]

Benzer şekilde, daha karmaşık komut dosyaları, kabuk komut dosyası dilinin kendi sınırlamalarına girebilir; Sınırlar, kaliteli kod yazmayı zorlaştırır ve orijinal kabuk diliyle sorunları iyileştirmek için çeşitli kabuklarla yapılan uzantılar sorunları daha da kötüleştirebilir.[13]

Bazı komut dosyası dillerini kullanmanın birçok dezavantajı, içindeki tasarım kusurlarından kaynaklanır. dil sözdizimi veya uygulama ve metin tabanlı bir komut satırının kullanılması zorunlu değildir; diğer kabuk programlama dillerini ve hatta tam teşekküllü dilleri kullanan bir dizi kabuk vardır. Scsh (hangisi kullanır Şema ).

Diğer işletim sistemlerinde kabuk komut dosyası oluşturma

Gibi birlikte çalışabilirlik yazılımı Cygwin, MKS Araç Seti, Interix (Microsoft Windows Services for UNIX'te mevcuttur), Hamilton C kabuğu, SEN KAZANDIN (Windows için AT&T Unix) ve diğerleri, Unix kabuk programlarının Windows NT ve onun haleflerini çalıştıran makinelerde çalıştırılmasına izin verirken, MS-DOS -Windows 95 şubesi ve OS / 2 için önceki MKS Toolkit sürümleri. Windows tipi işletim sistemleri için en az üç DCL uygulaması - ek olarak XLNT, komut kabuğu ile kullanılan çok kullanımlı bir betik dili paketi, Windows Komut Dosyası Ana Bilgisayarı ve CGI programlama — bu sistemler için de mevcuttur. Mac OS X ve sonraki sürümleri de Unix'e benzer.[14]

Yukarıda belirtilen araçlara ek olarak, bazıları POSIX ve OS / 2 işlevselliği, Windows 2000'e kadar olan Windows NT işletim sistemi serisinin ilgili çevresel alt sistemleriyle de kullanılabilir. Bir üçüncü, 16 bit MS-DOS alt sistemi olarak adlandırılan alt sistem, yukarıda belirtilen MS-DOS toplu iş dosyalarını çalıştırmak için bu işletim sistemleriyle birlikte sağlanan Command.com'u kullanır.[15]

Konsol alternatifleri 4DOS, 4OS2, FreeDOS, Peter Norton 's NDOS ve 4NT / Komutu Al sırasıyla Windows NT tarzı cmd.exe, MS-DOS / Windows 95 toplu iş dosyalarına (Command.com tarafından çalıştırılır), OS / 2'nin cmd.exe ve 4NT'sine işlevsellik ekleyen özellikler, geliştirdikleri ve daha fazlası olan kabuklara benzer önceden yüklenmiş üç motor olan VBScript ile birlikte gelen Windows Script Host ile tümleşik, JScript, ve VBA ve Rexx, Perl, Python, Ruby ve Tcl ile 4NT ve ilgili programlarda önceden tanımlanmış işlevlere sahip çok sayıda üçüncü taraf motorun eklenebileceği. PC DOS MS-DOS'a oldukça benzer, ancak DR DOS daha farklı. Windows NT'nin önceki sürümleri, OS / 2 alt sistemi tarafından 4OS2'nin çağdaş sürümlerini çalıştırabilir.

Komut dosyası dilleri tanım gereği genişletilebilir; örneğin, bir MS-DOS / Windows 95/98 ve Windows NT tipi sistemler, kabuk / toplu iş programlarının aşağıdaki gibi araçları çağırmasına izin verir: KixTart, QBasic, çeşitli TEMEL, Rexx, Perl, ve Python uygulamalar, Windows Komut Dosyası Ana Bilgisayarı ve kurulu motorları. Unix ve diğerlerinde POSIX uyumlu sistemler, awk ve sed kabuk komut dosyalarının dizgesini ve sayısal işlem yeteneğini genişletmek için kullanılır. Tcl, Perl, Rexx ve Python'da grafik araç takımları vardır ve hız darboğazı (C, Fortran, montaj dili ve c çok daha hızlıdır) oluşturan kabuk komut dosyalarının işlevlerini ve prosedürlerini kodlamak ve kabuk dilinde kullanılamayan işlevler eklemek için kullanılabilir soketler ve diğer bağlantı işlevleri, yoğun metin işleme, arayan komut dosyası bu yeteneklere sahip değilse sayılarla çalışma, kendi kendine yazma ve kendi kendini değiştiren kod gibi teknikler, özyineleme, doğrudan bellek erişimi, çeşitli sıralama ve daha fazlası, ana senaryoda zor veya imkansız olan vb. Uygulamalar için Visual Basic ve VBScript Elektronik tablolar, veritabanları, her türden kodlanabilir programlar, telekomünikasyon yazılımları, geliştirme araçları, grafik araçları ve erişim yoluyla erişilebilen diğer yazılımlar gibi şeyleri kontrol etmek ve iletişim kurmak için kullanılabilir. Bileşen Nesne Modeli.

Ayrıca bakınız

Referanslar

  1. ^ Kernighan, Brian W.; Pike, Rob (1984), "3. Kabuğu Kullanma", UNIX Programlama Ortamı, Prentice Hall, Inc., s. 94, ISBN  0-13-937699-2, Kabuk aslında bir programlama dilidir: değişkenler, döngüler, karar verme vb. İçerir.
  2. ^ Örneklerle Unix Kabuklar, s. 7-10,
  3. ^ Perl Programlama, 5. Baskı, önsöz
  4. ^ "osh - manned.org". manned.org. Alındı 2019-01-16.
  5. ^ a b Johnson, Chris (2009).[1] Pro Bash Programlama: Linux Kabuğu için Komut Dosyası Oluşturma, Apress, Erişim tarihi: 27 Eylül 2019. ISBN  9781430219989
  6. ^ "exec (3p) - POSIX Programcı Kılavuzu". Alındı 2020-07-24.
  7. ^ Robbins, Arnold; Beebe, Nelson H.F. (16 Mayıs 2005). Klasik Kabuk Komut Dosyası: Unix'in Gücünü Ortaya Çıkaran Gizli Komutlar. O'Reilly Media, Inc. s. 10. ISBN  9780596555269. Alındı 7 Mayıs 2017. Bir dosyanın ilk iki karakteri! # Olduğunda, çekirdek, programı çalıştırmak için kullanmak üzere yorumlayıcının tam yol adı için satırın geri kalanını tarar.
  8. ^ Carling, M .; Degler, Stephen; Dennis, James (2000). Linux Sistem Yönetimi. Sams Yayıncılık. s. 275. ISBN  9781562059347. Alındı 7 Mayıs 2017. Tipik bir kabuk betiği veya işlevi bittiğinde, ebeveyninin başarılı olup olmadığını (veya bazı durumlarda ne tür bir eylem gerçekleştirdiğini) bilmesini sağlamak için 0 ile 255 arasında bir tamsayı döndürebilir.
  9. ^ Kumari, Sinny (23 Kasım 2015). Linux Shell Scripting Essentials. Packt Yayıncılık Ltd. ISBN  9781783552375. Alındı 7 Mayıs 2017. Kabuk betikleri için bir dosya uzantısı kullanmak yerine, bir dosya adını uzantısız tutmak ve yorumlayıcının türü shebang (#!) 'A bakarak tanımlamasına izin vermek tercih edilir.
  10. ^ Taylor, Dave; Perry, Brandon (16 Aralık 2016). Wicked Cool Shell Scripts, 2nd Edition: Linux, OS X ve UNIX Sistemleri için 101 Komut Dosyası. Nişasta Presi Yok. ISBN  9781593276027. Alındı 7 Mayıs 2017. Kabuk komut dosyalarının özel bir dosya uzantısına ihtiyacı yoktur, bu nedenle uzantıyı boş bırakın (veya isterseniz .sh uzantısını ekleyebilirsiniz, ancak bu gerekli değildir.
  11. ^ Robbins, Arnold; Hannah, Elbert; Kuzu, Linda (2008). Vi ve Vim Editörlerini Öğrenmek. s. 205. ISBN  9781449313258.
  12. ^ Easttom, Chuck (2012). Temel Linux Yönetimi :: Yeni Başlayanlar İçin Kapsamlı Bir Kılavuz. s. 228. ISBN  978-1435459571.
  13. ^ "Csh Programlama Zararlı Olarak Kabul Edilir".
  14. ^ MSDN[doğrulamak için yeterince spesifik değil ]
  15. ^ Windows NT 4 İş İstasyonu Kaynak Seti

Dış bağlantılar