Apakah 'cat' shell built-in atau program eksternal?

33

Ketika saya menggunakan typeperintah untuk mencari tahu apakah catshell built-in atau program eksternal saya mendapatkan output di bawah ini:

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

Apakah ini berarti itu catadalah program eksternal /bin/cat?

Saya jadi bingung, karena ketika saya mengecek output di bawah untuk echosaya harus melihat bahwa itu adalah built-intetapi juga sebuah program/bin/echo

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

Jadi saya tidak bisa menggunakan logika yang /bin/catberarti program eksternal, karena gema /bin/echomasih built-in.

Jadi bagaimana saya tahu apa catitu? Built-in atau eksternal?

sps
sumber
1
-The command cat adalah program eksternal yang membuat bagian dari sistem, karena banyak tindakan yang dapat dilakukannya bukanlah built-in yang sederhana.
Lelucon Sr. OK
12
type whichbisa memberi Anda jawaban mengapa whichtidak akan memberi Anda jawabannya.
Dubu
1
Tergantung pada shell yang Anda gunakan
nsn
6
Fun fakta: baik catdan lsyang / ditulis oleh Stallman sendiri. Anda akan terkejut betapa banyak hal yang dia tulis. Jangan lupa dia menulis versi pertama dari kompiler yang saat ini adalah kompiler terbaik di dunia yang mengkompilasi SEMUA dan sebagian besar utilitas inti. Katakan saja '
Alec Teal
2
@AlecTeal Anda benar-benar menyadari bahwa sebagian besar sistem Unix menggunakan versi ls dan cat yang sudah lama ada sebelum versi GNU yang pernah ditangani oleh Richard Stallman?
Ross Ridge

Jawaban:

59

typememberi tahu Anda apa yang shell akan gunakan. Sebagai contoh:

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

Itu berarti jika, pada bash prompt, Anda mengetik echo, Anda akan mendapatkan bawaan. Jika Anda menentukan path, seperti pada /bin/echo, Anda akan mendapatkan perintah eksternal.

which, sebaliknya adalah program eksternal yang tidak memiliki pengetahuan khusus tentang apa yang akan dilakukan shell. Pada sistem seperti debian, whichadalah skrip shell yang mencari PATH untuk dieksekusi. Dengan demikian, itu akan memberi Anda nama executable eksternal bahkan jika shell akan menggunakan built-in.

Jika perintah hanya tersedia sebagai built-in, tidak whichakan mengembalikan apa pun:

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

Sekarang, mari kita lihat cat:

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

cat adalah eksekusi eksternal, bukan shell builtin.

John1024
sumber
5
Anda bisa type -all echomengetahui (secara berurutan) yang merupakan "gema" berbeda yang diketahui oleh shell (yang pertama adalah shell yang akan dipanggil, jika Anda tidak menentukan sesuatu untuk mengubah urutan, seperti memohon "echo"atau \echo, atau command echo)
Olivier Dulac
Jawaban yang bagus. Satu tambahan: Ada dua versi echountuk alasan historis. Ini dimulai sebagai perintah eksternal, kemudian ditambahkan sebagai built-in. Versi awal shell Bourne ( /bin/sh) tidak memilikinya. /bin/echodisimpan untuk kompatibilitas, karena semua hal tergantung padanya. (Hal yang sama terjadi dengan test.)
alexis
Catatan samping: whichitu sendiri bisa berupa shell built-in cmd, misalnya dalam tcsh:which which which: shell built-in command.
Dan Cornilescu
Saya datang terlambat ke pesta, tetapi mengapa Anda tidak memeriksa halaman manualnya dan Anda benar-benar dapat melihat nomor di antara tanda kurung, yang menunjukkan apakah itu adalah shell built-in atau apa pun
poz2k4444
46

cat is hashed (/bin/cat)sama seperti cat is /bin/cat(yaitu, ini adalah program eksternal ).

Perbedaannya adalah bahwa Anda sudah berlari catdi sesi ini, jadi bash sudah mencarinya $PATHdan menyimpan lokasi yang dihasilkan di tabel hash sehingga tidak harus mencarinya lagi di sesi ini.

Untuk melihat semua perintah yang telah hash dalam sesi Anda, jalankan 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
André Chalella
sumber
9
Sebenarnya, menurut pendapat saya ini adalah satu-satunya jawaban yang menjawab pertanyaan Anda :)
André Chalella
IMHO ini ^^^ benar. Jawaban ini harus diterima.
LinuxSecurityFreak
4

Cara lain untuk memeriksa daftar shell builtin: Menggunakan compgenshell mana yang dibangun sendiri!

Perintah berikut mencantumkan semua perintah built-in shell:

compgen -b

Anda dapat memeriksa cat, echodengan menggerutu seperti: -

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

Anda dapat melihat compgen -b | grep catpengembalian tanpa output, berarti cattidak builtin shell .

Kunjungi daftar opsi bermanfaat yang disediakan oleh compgen.


Anda juga dapat menggunakan satu sama lain perintah builtin: helpuntuk menampilkan shell-builtin.

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.
Pandya
sumber
Saya tidak dapat menemukan dokumentasi formal untuk opsi ini, apakah Anda tahu di mana ada?
Random832
@ Random832 maksud Anda tentang opsi compgen?
Pandya
ya, saya tidak dapat menemukan apa pun di halaman buku Bash tentang apa -b atau setengah dari opsi yang lain. Ditemukan nanti di gnu.org/software/bash/manual/html_node/…
Random832
@ Random832 coba man bash | grep -e '-A action$' -A 32Anda mungkin mendapatkan output seperti ini . (menambah / mengurangi digit setelah -Amengatur dengan benar).
Pandya
4

Anda juga dapat menggunakan perintah whereisyang lebih efisien karena itu menunjukkan di mana perintah ada di mesin seperti juga halaman perpustakaan manual, dll.

Lelucon Sr. Oke
sumber
-Maafkan saya karena bahasa Inggris saya yang buruk, karena saya baru saja belajar dan tidak begitu baik menggunakan! ...
Lelucon Sr. OK
2

Orang lain sudah menjawab cat, Saya hanya ingin menjelaskan masalah ini echo. Jika Anda menggunakan jenis ini -apilihan (daftar semua pertandingan), Anda akan melihat bahwa echoadalah baik sebuah builtin shell dan program eksternal:

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

Keduanya sepenuhnya independen satu sama lain. typetanpa opsi hanya akan mengembalikan perintah pencocokan pertama yang ditemukan. Jadi, ketik fooakan menunjukkan kepada Anda apa yang akan dieksekusi jika Anda menjalankan foo. Mungkin ada opsi lain, tetapi itu tidak akan ditampilkan kecuali Anda menggunakan -a.

terdon
sumber
2

Karena ada beberapa jawaban yang baik di sini tentang penggunaan tipe untuk mengetahui apakah perintah seperti catadalah builtin atau program eksternal. Saya akan mengambil pendekatan yang lebih umum. Ada beberapa perintah yang harus dibangun karena mereka mempengaruhi shell saat ini. Tiga contoh klasik cd, exec, dan exit. Ada beberapa perintah yang tidak boleh dibangun karena fungsionalitasnya tergantung pada perilaku dari eksekusi atau panggilan sistem. Contoh program tersebut termasuk su, sudo, califedan super. Semua perintah lain dapat dibangun sebagai builtin atau program eksternal.catadalah contoh program yang bagus dari kelas ini karena ada shell yang memasukkannya sebagai builtin dan shell yang tidak. Perlu dicatat bahwa banyak perintah dari kelas ini yang tersedia sebagai builtin juga tersedia sebagai program eksternal.

Hildred
sumber