'Cat' bir kabuk yerleşik mi yoksa harici bir program mı?


33

Bir kabuk yerleşik mi yoksa harici bir program typecatolduğunu öğrenmek için komutu kullandığımda aşağıdaki çıktıyı alıyorum:

-$ type cat
cat is hashed (/bin/cat)
-$

Bu cat, bunun harici bir program olduğu anlamına mı geliyor /bin/cat?

Kafam karıştı, çünkü aşağıdaki çıktıyı kontrol echoettiğimde bunun built-inaynı zamanda bir program olduğunu görmeye başladım./bin/echo

-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$ 

Bu yüzden /bin/catmutlaka harici bir program anlamına gelen mantığı kullanamadım , çünkü yankı /bin/echohala yerleşikti.

Peki ne olduğunu nasıl bilebilirim cat? Dahili veya harici?


1
-Komut, sistemin bir parçasını oluşturan harici bir programdır, çünkü yapabileceği birçok işlem basit bir yerleşik değildir.
Şaka Sr. OK

12
type whichSana cevap vereyim neden cevap whichvermeyeceksin.
Dubu

1
Kullanmakta olduğunuz kabuğa bağlı olarak
nsn

6
Eğlenceli gerçek: Her ikisi de catve lsStallman tarafından yazılmıştır. Ne kadar şey yazdığına şaşıracaksın. Unutmayın ki, bugün dünyanın en iyi derleyicisi olan derleyicinin ilk versiyonlarını, HERŞEYİ ve çekirdek çözümlerin çoğunu derledi. Sadece söylüyorum
Alec Teal

2
@AlecTeal Unix sistemlerinin çoğunun, Richard Stallman'ın elinde bulundurduğu GNU sürümlerini uzun süre önce kullanan ls ve cat sürümlerini kullandığının farkında mısın?
Ross Ridge

Yanıtlar:


59

typesize kabuğun ne kullanacağını söyler. Örneğin:

$ type echo
echo is a shell builtin
$ type /bin/echo
/bin/echo is /bin/echo

Bu, eğer bash komut isteminde yazarsanız echo, yerleşik olanı alacağınız anlamına gelir . Yolu belirtirseniz, olduğu gibi /bin/echo, harici komutu alırsınız.

whichBunun aksine, kabuğun ne yapacağına dair özel bir bilgisi olmayan harici bir programdır. Debian benzeri sistemlerde, whichPATH'yi yürütülebilir dosya için arayan bir kabuk betiğidir. Bu nedenle, kabuk bir yerleşik kullansa bile, harici yürütülebilir dosyanın adını verecektir.

Bir komut yalnızca yerleşik olarak mevcutsa, whichhiçbir şey döndürmez:

$ type help
help is a shell builtin
$ which help
$ 

Şimdi, bakalım cat:

$ type cat
cat is hashed (/bin/cat)
$ which cat
/bin/cat

cat harici bir çalıştırılabilir, bir kabuk yerleşik değil.


5
Sen olabilir type -all echo(bir tane bir şey belirtmek yoksa kabuk çağırma gibi sırasını değiştirmek için, arayacak olan İlki kabuğuna bilinen "yankı" farklı olan (sırayla) öğrenmek için "echo"ya \echoya command echo)
Olivier Dulac

İyi cevap. Bir ek: echoTarihsel sebeplerden iki versiyonu var . Harici bir komut olarak başladı, sonra bir dahili olarak eklendi. Bourne kabuğunun ( /bin/sh) ilk sürümlerinde yoktu. /bin/echoHer türlü şeye bağlı olduğu için uyumluluk için devam edildi. (Aynı şey oldu test.)
alexis

Not: whichKendisi yerleşik cmd gibi bir kabuk olabilir, örneğin tcsh:which which which: shell built-in command.
Dan Cornilescu

Partiye geç geliyorum, fakat neden man sayfasını kontrol etmiyorsunuz ve parantez arasındaki sayıyı gerçekten görebiliyorsunuz, bu bir kabuğun yerleşik olup olmadığını gösterir
poz2k4444

46

cat is hashed (/bin/cat)aynen böyle cat is /bin/cat( harici bir program ).

Aradaki fark, zaten catbu oturumda koştunuz, bu yüzden bash zaten araştırdı $PATHve elde edilen konumu bir karma tablosunda sakladı, böylece bu oturumda tekrar bakmak zorunda kalmadı.

Oturumunuzdaki karma tüm komutları görmek için, hash

$ hash
hits    command
   2    /usr/bin/sleep
   3    /usr/bin/man

$ type sleep
sleep is hashed (/usr/bin/sleep)

$ type man
man is hashed (/usr/bin/man)

$ type ls
ls is /usr/bin/ls

$ type cat
cat is /usr/bin/cat

$ type echo
echo is a shell builtin

9
Aslında, bence sorunuzu ele alan tek cevap budur :)
André Chalella

IMHO bu ^ ^ ^ doğru. Bu cevap kabul edilen cevap olmalıdır.
LinuxSecurityFreak

4

Kabuk yerleşiminin listesini kontrol etmenin başka bir yolu: Kabuğun yerleşikini kullanmak compgen!

Aşağıdaki komut, tüm kabuk yerleşik komutlarını listeler:

compgen -b

Sen kontrol edebilirsiniz cat, echogibi greping tarafından: -

$ compgen -b | grep echo
echo
$ compgen -b | grep cat
$ 

compgen -b | grep catÇıktısız dönüşleri görebilirsiniz , catkabuğun yerleşik olmadığı anlamına gelir .

Tarafından sağlanan kullanışlı seçeneklerin bir listesini ziyaret edin .compgen .


Bir başka yerleşik komut da kullanabilirsiniz: helpkabuk yerleşikini görüntülemek için.

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

Bu seçenekler için resmi bir belge bulamıyorum, nerede olduğunu biliyor musunuz?
Random832

@ Random832 için seçeneklerden mi bahsediyorsunuz compgen?
Pandya

Evet, Bash el kitabında diğer seçeneklerin ne anlama geldiğinin ya da yarısının ne olduğu hakkında hiçbir şey bulamadım. Daha sonra gnu.org/software/bash/manual/html_node/…
Random832 11:15

Random832 @ denemek man bash | grep -e '-A action$' -A 32muhtemelen gibi çıktı almak bu . ( -ADoğru şekilde yönetildikten sonra haneyi artırın / azaltın ).
Pandya

4

Ayrıca komutun whereisdaha verimli olduğunu da kullanabilirsiniz, çünkü komutun makinede nerede olduğunu manuel sayfa kitaplığı vb. Gibi gösterir.


Sadece iyi kullanarak bunu henüz değil öğrenme, çünkü benim kötü İngilizce için Pardon ...!
Joke Sr. TAMAM

2

Diğerleri çoktan cevapladı cat, sadece konuyu açıklamak istiyorum echo. Eğer türünün kullanırsanız -aseçeneği (liste tüm maçları), bunu göreceksiniz echoolan hem bir kabuk yerleşik ve harici bir program:

$ type -a echo
echo is a shell builtin
echo is /bin/echo

İkisi birbirinden tamamen bağımsızdır. typeHiçbir seçenek olmadan bulunan ilk eşleme komutunu geri döndüreceksiniz. Yani, fooeğer koşarsan, ne yapılacağını yazacaksın foo. Başka seçenekler olabilir, ancak kullanmadıkça bunlar gösterilmez -a.


2

Burada cat, böyle bir komutun yerleşik veya harici bir program olup olmadığını anlamak için türün kullanılmasıyla ilgili birkaç iyi cevap vardır . Daha genel bir yaklaşım benim için gidiyorum. Geçerli kabuğu etkiledikleri için yerleşik olması gereken bazı komutlar vardır. Üç klasik örnekleridir cd, execve exit. Yerleşik olmayan bazı komutlar vardır, çünkü bunların işlevleri yürütme veya sistem çağrılarının davranışına bağlıdır. Bu tür programların örnekleri su, sudo, califeve super. Diğer tüm komutlar yerleşik veya harici programlar olarak oluşturulabilir.catBu sınıfın en iyi örneklerinden biri, onu yerleşik olarak içeren kabukları ve olmayan kabuklarıdır. Bu sınıfın yerleşik olarak kullanılabilen birçok komutunun harici programlar olarak da mevcut olduğunu belirtmekte fayda var.

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.