Ketika saya menjalankan dua perintah ini, saya mengerti
$ type cd
cd is a shell builtin
$ type if
if is a shell keyword
Jelas ditunjukkan bahwa cd
shell adalah builtin dan if
kata kunci shell. Jadi apa perbedaan antara shell builtin dan kata kunci?
command-line
Avinash Raj
sumber
sumber
Jawaban:
Ada perbedaan kuat antara builtin dan kata kunci, dalam cara Bash mem-parsing kode Anda. Sebelum kita berbicara tentang perbedaannya, mari kita daftarkan semua kata kunci dan bawaan:
Builtin:
Kata kunci:
Perhatikan bahwa, misalnya
[
adalah builtin dan itu[[
adalah kata kunci. Saya akan menggunakan keduanya untuk menggambarkan perbedaan di bawah ini, karena mereka adalah operator terkenal: semua orang tahu mereka dan menggunakannya secara teratur (atau harus).Kata kunci dipindai dan dipahami oleh Bash sangat awal dalam penguraiannya. Ini memungkinkan misalnya sebagai berikut:
Ini berfungsi dengan baik, dan Bash akan dengan senang hati mengeluarkan
Perhatikan bahwa saya tidak mengutip
$string_with_spaces
. Sedangkan yang berikut ini:menunjukkan bahwa Bash tidak bahagia:
Mengapa ini bekerja dengan kata kunci dan tidak dengan builtin? karena ketika Bash mem-parsing kode itu, ia melihat
[[
mana yang merupakan kata kunci, dan memahami sangat awal bahwa itu istimewa. Jadi akan mencari penutup]]
dan akan memperlakukan bagian dalam dengan cara yang khusus. Builtin (atau perintah) diperlakukan sebagai perintah aktual yang akan dipanggil dengan argumen. Dalam contoh terakhir ini, bash memahami bahwa ia harus menjalankan perintah[
dengan argumen (ditampilkan satu per baris):sejak ekspansi variabel, penghapusan kutipan, ekspansi pathname dan pemisahan kata terjadi. Perintah itu
[
ternyata dibangun di shell, jadi dieksekusi dengan argumen ini, yang menghasilkan kesalahan, karenanya keluhan.Dalam praktiknya, Anda melihat bahwa perbedaan ini memungkinkan perilaku canggih, yang tidak mungkin dilakukan dengan builtin (atau perintah).
Masih dalam praktiknya, bagaimana Anda bisa membedakan builtin dari kata kunci? ini adalah eksperimen yang menyenangkan untuk dilakukan:
Ketika Bash mem-parsing baris
$a -d . ]
, ia melihat tidak ada yang istimewa (yaitu, tidak ada alias, tidak ada pengalihan, tidak ada kata kunci), jadi itu hanya melakukan ekspansi variabel. Setelah ekspansi variabel, terlihat:jadi jalankan perintah (builtin)
[
dengan argumen-d
,.
dan]
, yang, tentu saja benar (ini hanya menguji apakah.
sebuah direktori).Sekarang lihat:
Oh Itu karena ketika Bash melihat baris ini, ia melihat tidak ada yang istimewa, dan karenanya memperluas semua variabel, dan akhirnya melihat:
Saat ini, pemanjangan alias dan pemindaian kata kunci telah lama dilakukan dan tidak akan dilakukan lagi, jadi Bash mencoba menemukan perintah yang dipanggil
[[
, tidak menemukannya, dan mengeluh.Sepanjang garis yang sama:
dan
Ekspansi alias juga sesuatu yang agak istimewa. Anda semua telah melakukan yang berikut setidaknya sekali:
Alasannya sama: ekspansi alias terjadi jauh sebelum ekspansi variabel dan penghapusan kutipan.
Kata kunci vs Alias
Sekarang menurut Anda apa yang terjadi jika kami menetapkan alias untuk menjadi kata kunci?
Oh, berhasil! jadi alias bisa digunakan untuk kata kunci alias! bagus untuk mengetahui.
Kesimpulan: builtin benar-benar berperilaku seperti perintah: mereka berhubungan dengan tindakan yang dieksekusi dengan argumen yang mengalami ekspansi variabel langsung dan pemisahan kata dan globbing. Ini benar-benar seperti memiliki perintah eksternal di suatu tempat di
/bin
atau/usr/bin
yang disebut dengan argumen yang diberikan setelah ekspansi variabel, dll. Perhatikan bahwa ketika saya mengatakan itu benar-benar seperti memiliki perintah eksternal yang saya maksud dengan hanya berkenaan dengan argumen, pemisahan kata, penggumpalan, ekspansi variabel, dll. builtin dapat memodifikasi keadaan internal shell!Kata kunci, di sisi lain, dipindai dan dipahami sangat awal, dan memungkinkan untuk perilaku shell canggih: shell akan dapat melarang pemisahan kata atau perluasan pathname, dll.
Sekarang lihat daftar bawaan dan kata kunci dan coba cari tahu mengapa beberapa perlu kata kunci.
!
adalah kata kunci. Tampaknya mungkin untuk meniru perilakunya dengan suatu fungsi:tapi ini akan melarang konstruksi seperti:
atau
Sama untuk
time
: lebih kuat untuk memiliki kata kunci sehingga dapat mengatur waktu perintah kompleks dan saluran pipa dengan pengalihan:Jika di
time
mana hanya perintah (bahkan builtin), itu hanya akan melihat argumengrep
,^#
dan/home/gniourf/.bashrc
, waktu ini, dan kemudian hasilnya akan melewati bagian-bagian yang tersisa dari pipa. Tetapi dengan kata kunci, Bash dapat menangani semuanya! itu bisatime
menyelesaikan pipa, termasuk pengalihan! Jikatime
hanya perintah, kami tidak bisa melakukan:Cobalah:
Coba perbaiki (?):
Putus asa.
Kata kunci vs alias?
Menurut Anda apa yang terjadi?
Sungguh, builtin seperti sebuah perintah, kecuali itu dibangun di shell, sedangkan kata kunci adalah sesuatu yang memungkinkan untuk perilaku canggih! kita dapat mengatakan itu bagian dari tata bahasa shell.
sumber
=\
'dengan menggunakanman
,apropos
, danhelp
dan saya sudah tidak punya keberuntungan. Adakah tahu ke mana saya akan pergi mencari info ini? Sebagian besar sehingga di masa depan saya bisa melihat apa lagi yang ada di sana, karena saya pikir saya kehilangan sumber referensi.\ll
,,"ll"
atau'll'
.[[
hasil,\[[
itu tidak diurai sebagai alias. Benar sejauh ini? Di mana saya tersesat tidak menyadari backslash adalah hal mengutip di Bash, dan saya mencoba mencarinya di bawah alias dan kata kunci dan benar-benar hilang ... Semuanya baik-baik saja sekarang. Di bawah bagian Quoting:> Backslash () yang tidak dikutip adalah karakter pelarian.\[[
merupakan token tunggal dari tipe LiteralQuoteToken, yang berlawanan dengan[[
yang akan menjadi OpenTestKeywordToken, dan yang memerlukan penutupan]]
CloseTestKeywordToken untuk kompilasi oroper / sintaks yang benar. Kemudian, dalam (4) LiteralQuoteToken akan dievaluasi[[
sebagai nama bulitin / perintah untuk dieksekusi, dan dalam (6) Bash akan muntah karena tidak ada[[
builtin atau perintah. Bagus. Saya mungkin melupakan detail yang tepat dari waktu ke waktu, tetapi pada saat ini cara Bash menjalankan banyak hal lebih jelas bagi saya; Terima kasih.man bash
memanggil merekaSHELL BUILTIN COMMANDS
. Jadi, "shell builtin" sama seperti perintah normal, sepertigrep
, dll., Tetapi alih-alih terkandung dalam file yang terpisah, itu dibangun ke dalam bash itu sendiri . Ini membuat mereka melakukan lebih efisien daripada perintah eksternal.Sebuah kata kunci juga "dikodekan ke dalam Bash, tetapi tidak seperti builtin, kata kunci itu sendiri bukan perintah, tetapi subunit dari perintah konstruksi." Saya menafsirkan ini berarti bahwa kata kunci tidak memiliki fungsi sendiri, tetapi memerlukan perintah untuk melakukan apa saja. (Dari link, contoh lainnya adalah
for
,while
,do
, dan!
, dan ada lebih dalam jawaban saya untuk pertanyaan Anda yang lain.)sumber
[[ is a shell keyword
tapi[ is a shell builtin
. Saya tidak tahu kenapa.[
ada sebagai perintah terpisah pada masa itu.[[
tidak ditentukan oleh standar, sehingga pengembang dapat memilih untuk memasukkannya sebagai kata kunci atau sebagai bawaan.Manual baris perintah yang datang dengan Ubuntu tidak memberikan definisi kata kunci, namun manual online (lihat sidenote) dan spesifikasi standar Bahasa Perintah POSIX Shell , lihat ini sebagai "Kata-kata yang Dicadangkan", dan keduanya memberikan daftar itu. Dari standar POSIX:
Kuncinya di sini adalah bahwa kata kunci / kata-kata yang dipesan memiliki makna khusus karena mereka memfasilitasi sintaksis shell, berfungsi untuk memberi sinyal blok kode tertentu seperti loop, perintah majemuk, pernyataan percabangan (jika / kasus), dll. Mereka memungkinkan pembentukan pernyataan perintah, tetapi sendiri - tidak melakukan apa-apa, dan bahkan jika Anda memasukkan kata kunci seperti
for
,until
,case
- shell akan mengharapkan pernyataan lengkap, jika tidak - kesalahan sintaks:Pada tingkat kode sumber, kata-kata dicadangkan untuk bash didefinisikan dalam parese.y , sementara built-in memiliki seluruh direktori yang didedikasikan untuk mereka.
Sidenote
Indeks GNU ditampilkan
[
sebagai kata yang dilindungi undang-undang, namun itu sebenarnya adalah perintah bawaan.[[
sebaliknya adalah kata khusus.Lihat juga: Perbedaan antara kata kunci, kata yang dipesan, dan bawaan?
sumber