Ketika saya menggunakan type
perintah untuk mencari tahu apakah cat
shell built-in atau program eksternal saya mendapatkan output di bawah ini:
-$ type cat
cat is hashed (/bin/cat)
-$
Apakah ini berarti itu cat
adalah program eksternal /bin/cat
?
Saya jadi bingung, karena ketika saya mengecek output di bawah untuk echo
saya harus melihat bahwa itu adalah built-in
tetapi juga sebuah program/bin/echo
-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$
Jadi saya tidak bisa menggunakan logika yang /bin/cat
berarti program eksternal, karena gema /bin/echo
masih built-in.
Jadi bagaimana saya tahu apa cat
itu? Built-in atau eksternal?
bash
cat
echo
shell-builtin
sps
sumber
sumber
type which
bisa memberi Anda jawaban mengapawhich
tidak akan memberi Anda jawabannya.cat
danls
yang / 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 'Jawaban:
type
memberi tahu Anda apa yang shell akan gunakan. Sebagai contoh: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,which
adalah 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
which
akan mengembalikan apa pun:Sekarang, mari kita lihat
cat
:cat
adalah eksekusi eksternal, bukan shell builtin.sumber
type -all echo
mengetahui (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
, ataucommand echo
)echo
untuk alasan historis. Ini dimulai sebagai perintah eksternal, kemudian ditambahkan sebagai built-in. Versi awal shell Bourne (/bin/sh
) tidak memilikinya./bin/echo
disimpan untuk kompatibilitas, karena semua hal tergantung padanya. (Hal yang sama terjadi dengantest
.)which
itu sendiri bisa berupa shell built-in cmd, misalnya dalam tcsh:which which
which: shell built-in command.
cat is hashed (/bin/cat)
sama seperticat is /bin/cat
(yaitu, ini adalah program eksternal ).Perbedaannya adalah bahwa Anda sudah berlari
cat
di sesi ini, jadi bash sudah mencarinya$PATH
dan 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
sumber
Cara lain untuk memeriksa daftar shell builtin: Menggunakan
compgen
shell mana yang dibangun sendiri!Perintah berikut mencantumkan semua perintah built-in shell:
Anda dapat memeriksa
cat
,echo
dengan menggerutu seperti: -Anda dapat melihat
compgen -b | grep cat
pengembalian tanpa output, berarticat
tidak builtin shell .Kunjungi daftar opsi bermanfaat yang disediakan oleh
compgen
.Anda juga dapat menggunakan satu sama lain perintah builtin:
help
untuk menampilkan shell-builtin.sumber
compgen
?man bash | grep -e '-A action$' -A 32
Anda mungkin mendapatkan output seperti ini . (menambah / mengurangi digit setelah-A
mengatur dengan benar).Anda juga dapat menggunakan perintah
whereis
yang lebih efisien karena itu menunjukkan di mana perintah ada di mesin seperti juga halaman perpustakaan manual, dll.sumber
Orang lain sudah menjawab
cat
, Saya hanya ingin menjelaskan masalah iniecho
. Jika Anda menggunakan jenis ini-a
pilihan (daftar semua pertandingan), Anda akan melihat bahwaecho
adalah baik sebuah builtin shell dan program eksternal:Keduanya sepenuhnya independen satu sama lain.
type
tanpa opsi hanya akan mengembalikan perintah pencocokan pertama yang ditemukan. Jadi, ketikfoo
akan menunjukkan kepada Anda apa yang akan dieksekusi jika Anda menjalankanfoo
. Mungkin ada opsi lain, tetapi itu tidak akan ditampilkan kecuali Anda menggunakan-a
.sumber
Karena ada beberapa jawaban yang baik di sini tentang penggunaan tipe untuk mengetahui apakah perintah seperti
cat
adalah 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 klasikcd
,exec
, danexit
. Ada beberapa perintah yang tidak boleh dibangun karena fungsionalitasnya tergantung pada perilaku dari eksekusi atau panggilan sistem. Contoh program tersebut termasuksu
,sudo
,calife
dansuper
. Semua perintah lain dapat dibangun sebagai builtin atau program eksternal.cat
adalah 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.sumber