Bir yerleşik komutla olmayan bir komut arasındaki fark nedir?


72

Bir yerleşik komut ile aynı şeyi nominal olarak yapabilen başka bir komut arasında herhangi bir gerçek fark var mı?

Örneğin. Yerleşikler "özel" muamele görüyor mu? ... onları çalıştıran daha az yük var mı? .. ya da sadece basitçe 'yerleşiktirler'; arabanızın gösterge tablosu gibi?

... ve bu yerleşiklerin kesin (güncel) bir listesi var mı?

Yanıtlar:


90

Yorumlarınızdan, tam olarak bir kabuğun ne olduğu konusunda kafanız karışmış gibi görünüyor . Çekirdek sistemi yönetmekten sorumludur. Programları yükleyen ve çalıştıran, dosyalara erişen, bellek ayıran vb. Bölümdür. Ancak çekirdeğin kullanıcı arayüzü yoktur; onunla sadece bir aracı olarak başka bir program kullanarak iletişim kurabilirsiniz.

Kabuk, bir komut istemi basan, sizden bir girdi satırı okuyan ve ardından dosyaları işlemek veya diğer programları çalıştırmak için bir veya daha fazla komut olarak yorumlayan bir programdır. GUI'nin icat edilmesinden önce, kabuk bir işletim sisteminin birincil kullanıcı arayüzü olmuştur. MS-DOS'ta kabuk çağrıldı command.comve çok az kişi farklı bir tane kullanmaya çalıştı. Ancak Unix'te, kullanıcıların seçebileceği çok sayıda kabuk vardır.

3 tipe ayrılabilirler. Bourne uyumlu kabuklar, orijinal Bourne kabuğundan elde edilen sözdizimini kullanır . C kabukları, orijinal C kabuğundan gelen sözdizimini kullanır . O zaman kendi sözdizimini icat eden veya bazı programlama dillerinden birini ödünç alan ve genellikle ilk iki türden daha az popüler olan geleneksel olmayan mermiler vardır.

Yerleşik bir komut, kabuğun kendisini başka bir programın yüklenmesi ve çalıştırılması için bir istek olarak yorumlamak yerine gerçekleştirdiği bir komuttur. Bunun iki ana etkisi var. Birincisi, genellikle daha hızlıdır, çünkü bir programın yüklenmesi ve çalıştırılması zaman alır. Elbette, komutun çalışması ne kadar uzun sürerse, yükleme süresi genel çalışma süresiyle karşılaştırıldığında ne kadar az önemliyse (yükleme süresi oldukça sabittir).

İkincisi, yerleşik bir komut kabuğun iç durumunu etkileyebilir. Bu nedenle, gibi komutların yerleşik cd olması gerekir , çünkü harici bir program kabuğun geçerli dizinini değiştiremez. echoVerimlilik için yerleşik olan diğer komutlar da olabilir, ancak harici komutlar olmamalarının gerçek bir nedeni yoktur.

Hangi komutların yerleşik olduğunu kullandığınız kabuğa göre değişir. Bir liste için belgelerine bakmanız gerekecektir (örneğin, bashyerleşik komutları , kılavuzunun 4. Bölümünde listelenmiştir ). typeBir komut yerleşik (kabuk POSIX uyumlu ise) ise POSIX gerektirdiğinden komut söyleyebilirim typeyerleşik olması. Eğer whichkabuğunuzdaki bir yerleşik değilse, o zaman muhtemelen kabuğunuzun yerleşik yapılarını bilmeyecek, ancak sadece harici programları arayacaktır.


Aslında uygulamalar kesinti yaparak çekirdekle iletişim kurar.
Nathan Osman

11
@George: Uygulamalar, işletim sistemine ve mimariye bağlı olarak kesintileri kullanabilen veya kullanamayan sistem çağrıları yaparak çekirdekle iletişim kurar. Kullanıcılar kural olarak kesinti yapmazlar.
Gilles,

2
@cjm: Öyle açıkladığın zaman çok basit geliyor:) ... kesinlikle sisi temizlemeye yardım ettin ... şimdi sadece hafif bir sis ... (aslında buradaki hava böyle, bu sabah. .. hoş puslu;) ... teşekkürler
Peter.O

@Gilles: Gerçekten mi? Tüm kullanıcı modu programlarının, çekirdeklerle kesintiler yoluyla (bazı mimarilerde elbette) iletişim kurduğunu düşündüm.
Nathan Osman,

2
@cjm Çok kapsamlı ve öğretici cevap. Onu okuyarak çok şey öğrendim. :)
ankush981 28:15

37

Üç yerleşik yardımcı program düzeyi vardır:

  • Bazı yardımcı programlar, ayrılmış sözcükler olmasa da, gerçekten bir programlama dili olarak kabuğun bir parçasıdır . Bunlar, kontrol akış araçları (vardır ., :, break, continue, return, trap, exit, exec, eval), parametre ilgili programları ( set, unset, shift, export, readonly, local¹, typeset¹), takma araçları ( alias² unalias²) ve times³. Bu özel yapımlar özel muamele görür :

    • Yanlış argümanları özel bir yerleşik cihaza iletirseniz, bir hata mesajı görüntüledikten sonra bir sonraki komuta geçmek yerine kabuğun kendisi iptal edilebilir.
    • Ön atama sözdiziminin foo=bar utilityfarklı bir anlamı vardır: bu foo=bar; utility, yalnızca fayda süresi için ortama atanmak yerine sıradan bir parametre atamasıdır (yani eşdeğer ).
  • Bazı hizmetlerin kabuğun içine uygulanması gerekir , çünkü kabuğun iç ayarlarına etki ederler. Bu içerir:

    • gibi kabuk mevcut dizin hareket araçları cd, dirs, pushd, popd;
    • iş kontrolü gibi programları bg, disown, fg, jobs, wait;
    • okumak veya örneğin diğer kabuk özelliklerini işlemek programları builtin, command, hash, read, type, ulimit, umask;
    • gibi onlar mevcut konum etkileşimli özelliklere, ilgili kamu fc, history, bind.
  • Bazı araçlar, genellikle sadece için Ankastre olarak uygulanır performans : echo, printf, test, true, false.

Bash , ksh ve zsh gibi gelişmiş kabuklar , genellikle standart dışı özellikleri uygulamak için (genellikle etkileşim için) genellikle daha fazla yerleşik yapıya sahiptir. Her kabuğun el kitabı size hangi komutların yerleşik olduğunu söylese de , bazı mermiler ( en azından zsh) , daha fazla dahili yapı sağlayabilen dinamik olarak yüklenebilir modülleri destekliyor.

IX POSIX'e bilinmiyor, ancak ksh ve diğer birçok kabukta özel.
² POSIX’de sıradan, ancak ksh ve diğer bazı kabuklarda özel.
³ olarak ksh, timesetrafında sarıcı timeanahtar kelime: onun için bir takma var { { time;} 2>&1;}. POSIX’in timesıradan ayrıştırma ile harici bir yardımcı program veya tüm bir boru hattına uygulanan bir anahtar kelime (ksh’da, zsh’da bash) olmasına izin verdiğine dikkat edin.


3
Bu ayrımlar gerçekten önemli olanlardır.
dmckee

Hızlı soru, öyleyse "normal parametre atama" ne anlama geliyor while IFS= read -r line?
Sergiy Kolodyazhnyy,

@SergiyKolodyazhnyy readözel bir yerleşik değil, bu nedenle IFS=readdeğişkeni yalnızca komut süresi boyunca ayarlar.
Gilles,

10

Bir yerleşik, harici bir program yerine kabuğun sağladığı bir komuttur. İşte için listeleri bash'ın yerleşikleri (onlar da bash adam sayfasında listelenen) ve zsh' s yerleşikleri . kshçalıştırarak bir liste sağlar builtin.

Belirli bir komutun yerleşik olup olmadığını bilmek için çalıştırabilirsiniz type command. Deneyin type forve type lsbunu görmek.


typehile yapmak gibi görünüyor; Bunun için teşekkürler ... ama yine de "kabuğun sağladığı" ne demek olduğunu merak ediyorum ... Belki kabuğun çekirdeğin nasıl ilişkili olduğunu daha iyi anlamam gerekiyor .... ama saat 2'de değil. Geleceğim buna geri dön
Peter.O

1

Her dağıtım ve kabuk, yerleşik kabuk işlevlerine karşı farklı bir komut koleksiyonuna sahiptir. Genel olarak fikir, kabukları, zamandan, hızdan ve iradesini özelliklerinin geri kalanıyla entegre etmek için en yaygın ve basit fonksiyonlarda barındırır. Genel gider, başka bir sistem işlemi başlatmak zorunda olmadığından daha düşüktür. Ancak karıştırmak ve eşleştirmek mümkündür. Bir şeyler için bir yapıya sahip olan bir kabuğu çalıştırabilir, ancak sisteminizde de bu komutu kullanabilirsiniz. Genellikle yerleşik yapı öncelikli olur, ancak bunu kontrol edebilirsiniz.

Belirli bir komutun yerleşik olup olmadığını kolayca öğrenebilirsiniz type mycommand. Çoğu kabuk sayfası, aynı zamanda yerleşiklerinin bir listesine sahiptir.

Düzenleme: Kullanım typeKomut bir yerleşik olup olmadığını öğrenmek için, ve eğer whichondan çalıştırılacaktır nerede öğrenmek için.


@Caleb: Yorumunuz için teşekkürler, ama bana tam olarak bir "sistem sürecinin" ne olduğunu merak etmeme izin veriyor. O zamana referansları görmeye devam ediyorum ama ayrımın yalan olduğunu anlamıyorum .... (btw yapamam 'hangisinin mutlak bir gösterge olduğunu görün) .. örneğin ..' hangi echo =>"/bin/echo" and echo =>"echo is a shell builtin", but 'which dd=> "/ bin / dd" ve type dd=> "dd / bin / dd yazın ..." ....
Peter.O

"Sistem süreçleri" sadece çekirdeğin yönettiği bağımsız bir uygulama olarak başlatıldığını gösterir. Yerleşiklerin durumunda alternatif, yalnızca kabuğunuzun çalışan kodunda bir alt işlev çalıştırıyordur. Verdiğiniz örnekte type, neyin çalıştırıldığının daha iyi bir göstergesi, ancak echohem bir yerleşik olduğunu hem de bu ada sahip bir uygulama olduğunu fark ediyorsunuz . Eğer kabuğunuzda yerleşik bir sistem yoksa, biri çalıştırılır.
Caleb

2
whichmutlaka yerleşik bir komut değildir ve değilse, kabuğun yerleşiklerini bilmez. POSIX, bunun typeyerleşik bir komut olmasını gerektirir , bu yüzden her zaman yerleşikleri bilir.
cjm

Bir takma adla Birçok sistem gemi whichiçin typeveya seçenekler örneğin bazı kümesi alias which='type -path'- Bu karışıklık kaynağı olabilir.
Random832

1
Bunu whichdeğiştiremem, yerine geçene kadar type. Bunları, tekrar tekrar bilmeden typeve lern için çok şaşırmış olan, whichprogramlar arasında karar verirken doğru olanı kullandım .
kullanıcı bilinmeyen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.