Apa perbedaan antara perintah builtin dan yang tidak?

72

Apakah ada perbedaan intrinsik antara perintah builtin dan perintah lain yang secara nominal dapat melakukan hal yang sama?

misalnya. Apakah orang builtin mendapatkan perawatan "khusus"? ... Apakah ada lebih sedikit overhead yang menjalankannya? .. atau mereka hanya 'built in'; suka dashboard mobil Anda?

... dan adakah daftar definitif (terkini) dari builtin ini?

Peter.O
sumber

Jawaban:

90

Dari komentar Anda, Anda tampaknya bingung tentang apa itu shell . Kernel bertanggung jawab untuk mengelola sistem. Itu adalah bagian yang benar-benar memuat dan menjalankan program, mengakses file, mengalokasikan memori, dll. Tetapi kernel tidak memiliki antarmuka pengguna; Anda hanya dapat berkomunikasi dengannya dengan menggunakan program lain sebagai perantara.

Shell adalah program yang mencetak prompt, membaca sebaris input dari Anda, dan kemudian mengartikannya sebagai satu atau lebih perintah untuk memanipulasi file atau menjalankan program lain. Sebelum penemuan GUI, shell adalah antarmuka pengguna utama dari OS. Pada MS-DOS, shell dipanggil command.comdan beberapa orang pernah mencoba menggunakan yang berbeda. Di Unix, bagaimanapun, sudah ada banyak shell yang bisa dipilih pengguna.

Mereka dapat dibagi menjadi 3 jenis. Shell yang kompatibel dengan Bourne menggunakan sintaks yang berasal dari shell Bourne yang asli . Kerang C menggunakan sintaksis dari kerang C yang asli . Lalu ada cangkang non-tradisional yang menemukan sintaks mereka sendiri, atau meminjam satu dari beberapa bahasa pemrograman, dan umumnya jauh kurang populer daripada dua jenis pertama.

Perintah bawaan hanyalah perintah yang dijalankan oleh shell itu sendiri, alih-alih menafsirkannya sebagai permintaan untuk memuat dan menjalankan beberapa program lain. Ini memiliki dua efek utama. Pertama, biasanya lebih cepat, karena memuat dan menjalankan program membutuhkan waktu. Tentu saja, semakin lama perintah dijalankan, semakin kecil waktu muat dibandingkan dengan keseluruhan waktu berjalan (karena waktu muat cukup konstan).

Kedua, perintah bawaan dapat memengaruhi kondisi internal shell. Itu sebabnya perintah seperti cd harus built-in, karena program eksternal tidak dapat mengubah direktori shell saat ini. Perintah lain, seperti echo, mungkin built-in untuk efisiensi, tetapi tidak ada alasan intrinsik mereka tidak bisa menjadi perintah eksternal.

Perintah mana yang terpasang di dalam tergantung pada shell yang Anda gunakan. Anda harus membaca dokumentasinya untuk daftar (mis., bashPerintah bawaan tercantum dalam Bab 4 manualnya ). The typeperintah dapat memberitahu Anda jika perintah adalah built-in (jika shell Anda adalah POSIX-kompatibel), karena POSIX mengharuskan typemenjadi built-in. Jika whichbukan built-in di shell Anda, maka itu mungkin tidak akan tahu tentang built-in shell Anda, tetapi hanya akan mencari program eksternal.

cjm
sumber
Aplikasi berkomunikasi dengan kernel dengan mengeluarkan interupsi, sebenarnya.
Nathan Osman
11
@ George: Aplikasi berkomunikasi dengan kernel dengan mengeluarkan syscalls, yang tergantung pada OS dan arsitektur mungkin atau mungkin tidak menggunakan interupsi. Pengguna, sebagai suatu peraturan, tidak mengeluarkan interupsi.
Gilles 'SO- berhenti bersikap jahat'
2
@ cjm: Kedengarannya sangat sederhana ketika Anda menjelaskannya seperti itu:) ... Anda telah membantu membersihkan kabut ... sekarang hanya kabut tipis .. (sebenarnya seperti itulah cuacanya di sini, pagi ini). .. sangat berkabut;) ... terima kasih
Peter.O
@Gilles: Benarkah? Saya pikir semua program mode pengguna dikomunikasikan dengan kernel melalui interupsi (pada arsitektur tertentu, tentu saja).
Nathan Osman
2
@ cjm Jawabannya sangat menyeluruh dan instruktif. Saya belajar banyak membacanya. :)
ankush981
37

Ada tiga tingkat utilitas bawaan:

  • Beberapa utilitas benar-benar bagian dari shell sebagai bahasa pemrograman, meskipun mereka bukan kata-kata yang dilindungi undang - undang . Mereka adalah aliran kontrol utilitas ( ., :, break, continue, return, trap, exit, exec, eval), parameter-terkait utilitas ( set, unset, shift, export, readonly, local¹, typeset¹), alias utilitas ( alias², unalias²) dan times³. Ini khusus built-in mendapatkan perlakuan khusus:

    • Jika Anda melewatkan argumen yang salah ke built-in khusus, shell itu sendiri dapat dibatalkan, bukan hanya melewatkan ke perintah berikutnya setelah menampilkan pesan kesalahan.
    • Sintaks pra-penugasan foo=bar utilitymemiliki arti yang berbeda: ini merupakan penugasan parameter biasa (yaitu setara dengan foo=bar; utility), alih-alih menetapkan ke lingkungan selama durasi utilitas saja.
  • Beberapa utilitas perlu diimplementasikan di dalam shell karena mereka bertindak pada pengaturan internal shell. Ini termasuk:

    • utilitas yang bekerja pada direktori saat shell seperti cd, dirs, pushd, popd;
    • kontrol pekerjaan utilitas seperti bg, disown, fg, jobs, wait;
    • utilitas yang membaca atau memanipulasi atribut shell lain seperti builtin, command, hash, read, type, ulimit, umask;
    • utilitas yang terkait dengan fitur-fitur interaktif, ketika mereka hadir, seperti fc, history, bind.
  • Beberapa utilitas biasanya diimplementasikan sebagai built-in murni untuk kinerja : echo, printf, test, true, false.

Shell canggih seperti bash , ksh dan zsh biasanya memiliki lebih banyak built-in, seringkali untuk mengimplementasikan fitur-fitur non-standar (biasanya untuk interaksi). Manual dari masing-masing shell akan memberi tahu Anda apa perintah built-in, meskipun beberapa shell ( zsh , setidaknya) mendukung modul yang dapat dimuat secara dinamis yang dapat memberikan lebih banyak built-in.

¹ Tidak diketahui POSIX, tetapi khusus di ksh dan beberapa shell lainnya.
² Biasa di POSIX, tetapi khusus di ksh dan beberapa kerang lainnya.
³ In ksh, timesadalah pembungkus timekata kunci: ini adalah alias untuk { { time;} 2>&1;}. Perhatikan bahwa POSIX memungkinkan timeuntuk menjadi utilitas eksternal dengan penguraian biasa atau kata kunci yang berlaku untuk seluruh pipa (yang ada di ksh, bash in zsh).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3
Perbedaan-perbedaan ini adalah yang sangat penting.
dmckee
Pertanyaan cepat, jadi apa arti "penetapan parameter biasa" ketika kita melakukannya while IFS= read -r line?
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy readbukan builtin khusus, jadi IFS=readsetel variabel hanya selama durasi perintah.
Gilles 'SANGAT berhenti menjadi jahat'
10

Builtin adalah perintah yang disediakan oleh shell, bukan oleh program eksternal. Berikut adalah daftar untuk bashbuiltin (mereka juga terdaftar di halaman bash man) dan zshbuiltin . kshmenyediakan daftar dengan menjalankan builtin.

Untuk mengetahui apakah perintah tertentu adalah builtin, Anda dapat menjalankan type command. Coba type fordan type lslihat ini.

Shawn J. Goff
sumber
typetampaknya melakukan trik; terima kasih untuk itu ... tapi saya masih bertanya-tanya apa artinya "disediakan oleh shell" ... Mungkin saya perlu lebih sepenuhnya memahami bagaimana shell berhubungan dengan kernel .... tetapi tidak pada jam 2 pagi .. Saya akan datang kembali ke ini besok
Peter.O
1

Setiap distro dan shell memiliki kumpulan perintah yang berbeda dengan fungsi shell builtin. Secara umum idenya adalah bahwa shell membangun fungsi yang paling umum dan sederhana untuk menghemat waktu, kecepatan, dan integrasi dengan sisa set fitur mereka. Biaya overhead jauh lebih rendah karena tidak harus meluncurkan proses sistem lain. Namun dimungkinkan untuk mencampur dan mencocokkan. Anda mungkin menjalankan satu shell yang memiliki buildin untuk sesuatu, tetapi memiliki perintah itu di sistem Anda juga. Biasanya builtin akan diprioritaskan, tetapi Anda bisa mengendalikannya.

Anda dapat dengan mudah mengetahui apakah perintah tertentu adalah builtin atau tidak dengan menjalankan type mycommand. Sebagian besar halaman shell manual juga memiliki daftar bawaan mereka.

Sunting: Gunakan typeuntuk mencari tahu apakah suatu perintah adalah builtin, dan jika tidak whichuntuk mengetahui dari mana ia akan dieksekusi.

Caleb
sumber
@ Caleb: terima kasih atas komentar Anda, tetapi membuat saya bertanya-tanya tentang apa sebenarnya "proses sistem" itu .. Saya terus melihat referensi untuk saat itu tetapi saya tidak mengerti di mana letak perbedaannya .... (tapi saya tidak bisa lihat bagaimana 'yang' merupakan indikator absolut) .. mis .. 'yang =>"/bin/echo" and jenis gema echo =>"echo is a shell builtin", but 'which dd=> "/ bin / dd" dan type dd=> "dd is / bin / dd" ... jadi, saya bagian tengah perjalanan ke sana ....
Peter.O
"System procses" hanya berarti sedang dijalankan sebagai aplikasi independen yang dikelola oleh kernel. Alternatif dalam kasus builtin hanya menjalankan sub-fungsi dalam kode shell yang sudah berjalan. Dalam contoh yang Anda berikan, typeadalah indikator yang lebih baik tentang apa yang sedang dijalankan, tetapi Anda perhatikan echoadalah builtin dan ada aplikasi dengan nama itu. Jika shell Anda tidak memiliki builtin sistem yang akan dijalankan.
Caleb
2
whichbukan berarti perintah bawaan, dan jika tidak, ia tidak akan tahu tentang bawaan shell. POSIX mengharuskan itu typemenjadi perintah bawaan, sehingga selalu tahu tentang built-in.
cjm
Banyak sistem dikirimkan dengan alias whichke typeatau sekumpulan opsi misalnya alias which='type -path'- ini bisa menjadi sumber kebingungan.
Random832
1
Saya tidak bisa membatalkan ini, sampai whichdigantikan oleh type. Saya menggunakan yang, berulang-ulang, tidak tahu typedan sangat heran untuk belajar, itu whichhanya benar, jika memutuskan antara program.
pengguna tidak diketahui