Semua shell builtins berbagi halaman buku panduan yang sama:
BUILTIN(1) BSD General Commands Manual BUILTIN(1)
NAME
builtin, !
dll.
Lalu ada sedikit teks yang menggambarkan apa itu builtin shell, dan kemudian daftar yang terlihat seperti ini:
Command External csh(1) sh(1)
! No No Yes
% No Yes No
Tetapi jika kita lakukan man grep
kita mendapatkan bagian seperti
- Bug
- Sejarah
- Lihat juga
- Standar
- Deskripsi
dll.
Bukankah shell builtin memiliki sejarah, deskripsi, dan argumen sendiri seperti -A
atau -r
? Mengapa itu tidak disediakan di halaman manual dan bagaimana saya belajar menggunakannya dengan benar dan efisien?
command-line
osx
freebsd
man
Nama tampilan
sumber
sumber
Jawaban:
Karena builtin adalah bagian dari shell. Bug atau riwayat apa pun yang mereka miliki adalah bug dan riwayat shell itu sendiri. Mereka bukan perintah independen dan tidak ada di luar shell yang dibangun ke dalamnya.
Setara,
bash
setidaknya, adalahhelp
perintah. Sebagai contoh:Semua bash builtin memiliki
help
halaman. Bahkanhelp
itu sendiri:Terinspirasi oleh
sed
skrip @ mikeserv , berikut adalah beberapa fungsi yang akan mencetak bagian yang relevan dari halaman manual menggunakan Perl. Tambahkan baris ini ke file inisialisasi shell Anda (~/.bashrc
untuk bash):Kemudian, Anda menjalankannya dengan memberikan halaman manual dan nama bagian:
sumber
SHELL BUILTIN COMMANDS
bagianbash
halaman manual. "Halaman manual" mereka adalahhelp builtin_name
.man git commit
menampilkan halaman manual untukgit-commit
. Sesuatu sepertiman bash if
itu akan luar biasa .Meskipun memang benar bahwa beberapa builtin shell mungkin memiliki sedikit menunjukkan dalam manual lengkap - terutama untuk
bash
builtin spesifik yang Anda hanya akan menggunakan pada sistem GNU (orang-orang GNU, sebagai aturan, sebagai aturan, tidak percaya padaman
dan lebih sukainfo
halaman mereka sendiri ) - sebagian besar utilitas POSIX - shell builtin atau lainnya - sangat terwakili dalam Panduan Programmer POSIX.Berikut adalah kutipan dari bagian bawah saya
man sh
(yang mungkin sekitar 20 halaman atau lebih ...)Semua orang yang ada, dan lain-lain tidak disebutkan seperti
set
,read
,break
... baik, saya tidak perlu nama mereka semua. Tetapi perhatikan(1P)
bagian kanan bawah - ini menunjukkan seri manual kategori 1 POSIX - itu adalahman
halaman yang saya bicarakan.Mungkin Anda hanya perlu menginstal paket? Ini terlihat menjanjikan untuk sistem Debian. Meskipun
help
berguna, jika Anda dapat menemukannya, Anda pasti harus mendapatkanPOSIX Programmer's Guide
seri itu. Ini bisa sangat membantu. Dan halaman konstituennya sangat detail.Selain itu, shell builtin hampir selalu terdaftar di bagian spesifik dari manual shell tertentu.
zsh
, misalnya, memiliki seluruhman
halaman terpisah untuk itu - (Saya pikir totalnya 8 atau 9zsh
halaman individu - termasukzshall
yang sangat besar.)Anda
grep
man
tentu saja dapat:... yang cukup dekat dengan apa yang saya lakukan ketika mencari
man
halaman shell . Tetapihelp
cukup bagusbash
dalam banyak kasus.Saya sebenarnya telah mengerjakan
sed
skrip untuk menangani hal-hal semacam ini baru-baru ini. Begitulah cara saya meraih bagian pada gambar di atas. Ini masih lebih lama dari yang saya suka, tetapi membaik - dan bisa sangat berguna. Dalam iterasi saat ini ia akan cukup andal mengekstrak bagian teks konteks-sensitif sebagai dicocokkan dengan bagian atau judul ayat berdasarkan pada pola [a] yang diberikan pada baris perintah. Ini warna output dan mencetak ke stdout.Ini bekerja dengan mengevaluasi level indentasi. Jalur input non-kosong umumnya diabaikan, tetapi ketika bertemu dengan garis kosong, ia mulai memperhatikan. Ia mengumpulkan garis-garis dari sana sampai ia memverifikasi bahwa urutan saat ini jelas membuat indentasi lebih dalam daripada yang dilakukan baris pertama sebelum baris kosong lainnya terjadi atau ia menjatuhkan thread dan menunggu untuk kosong berikutnya. Jika tes ini berhasil, ia mencoba untuk mencocokkan garis memimpin dengan args baris perintahnya.
Ini berarti bahwa pertandingan pola akan cocok:
..dan..
..tapi tidak..
..atau..
Jika kecocokan bisa didapat maka mulai mencetak. Ini akan menghapus kosong baris terkemuka yang cocok dari semua baris yang dicetaknya - jadi tidak peduli level indent yang ditemukannya, garis itu mencetaknya seolah-olah berada di atas. Ia akan terus mencetak hingga menemukan baris lain pada level indentasi yang sama atau kurang dari garis yang cocok - sehingga seluruh bagian diambil hanya dengan korek api heading, termasuk semua / semua sub-bagian, paragraf yang mungkin dikandungnya.
Jadi pada dasarnya jika Anda memintanya untuk mencocokkan suatu pola, ia hanya akan melakukannya terhadap judul subjek dan akan mewarnai dan mencetak semua teks yang ditemukannya di dalam bagian yang dikepalai oleh kecocokannya. Tidak ada yang disimpan karena ia melakukan ini kecuali indentasi baris pertama Anda - dan karenanya bisa sangat cepat dan menangani
\n
input yang dipisahkan secara ewline untuk hampir semua ukuran.Butuh beberapa saat bagi saya untuk mengetahui cara berulang ke subpos seperti berikut:
Tapi saya akhirnya mengatasinya.
Saya memang harus mengerjakan ulang semuanya demi kesederhanaan. Sementara sebelum saya memiliki beberapa loop kecil melakukan sebagian besar hal yang sama dengan cara yang sedikit berbeda agar sesuai dengan konteks mereka, dengan memvariasikan cara rekursi mereka, saya berhasil menduplikasi sebagian besar kode. Sekarang ada dua loop - satu cetakan dan satu cek indentasi. Keduanya tergantung pada tes yang sama - loop cetak dimulai ketika tes lulus dan loop indentasi mengambil alih ketika gagal atau dimulai pada baris kosong.
Seluruh proses ini sangat cepat karena sebagian besar waktu hanya
/./d
menghapus garis yang tidak kosong dan beralih ke yang berikutnya - bahkan hasil darizshall
mengisi layar secara instan. Ini belum berubah.Bagaimanapun, ini sangat berguna sejauh ini. Sebagai contoh,
read
hal di atas dapat dilakukan seperti:... Dan itu mendapat seluruh blok. Itu bisa mengambil pola atau apa saja, atau beberapa argumen, meskipun yang pertama selalu
man
halaman di mana ia harus mencari. Berikut adalah gambar dari beberapa output setelah saya melakukannya:... kedua blok dikembalikan utuh. Saya sering menggunakannya seperti:
... yang ini cukup berguna. Juga,
SYNOPS[ES]
membuatnya sangat berguna:Ini dia jika Anda ingin berputar - saya tidak akan menyalahkan Anda jika Anda tidak melakukannya.
Secara singkat, alur kerjanya adalah:
\n
karakter ewline dihapus dari output.\n
karakter garis tidak pernah terjadi dalam ruang pola input. Mereka hanya dapat dimiliki sebagai hasil edit.:print
dan:indent
keduanya merupakan loop tertutup yang saling bergantung dan merupakan satu-satunya cara untuk mendapatkan\n
ewline.:print
Siklus lingkaran dimulai jika karakter utama pada suatu baris adalah serangkaian kosong diikuti oleh\n
karakter ewline.:indent
Siklus dimulai pada baris kosong - atau pada:print
baris siklus yang gagal#test
- tetapi:indent
menghapus semua\n
urutan baris + kosong awal dari outputnya.:print
dimulai, ia akan terus menarik garis input, mengosongkan spasi putih hingga jumlah yang ditemukan pada baris pertama dalam siklusnya, menerjemahkan overstrike dan understrike backspace lolos ke terminal warna lolos, dan mencetak hasilnya hingga#test
gagal.:indent
mulai, pertama-tama periksah
ruang lama untuk kemungkinan kelanjutan inden yang mungkin (seperti Subbagian) , dan kemudian terus menarik input selama#test
gagal dan setiap baris setelah yang pertama terus cocok[-
. Ketika sebuah baris setelah yang pertama tidak cocok dengan pola itu dihapus - dan kemudian semua baris berikut sampai baris kosong berikutnya.#match
dan#test
menjembatani dua loop tertutup.#test
lewat ketika deretan kosong depan lebih pendek dari seri diikuti oleh baris terakhir\n
dalam urutan garis.#match
menambahkan beberapa baris utama yang\n
diperlukan untuk memulai:print
siklus ke:indent
urutan output mana pun yang mengarah pada kecocokan dengan setiap baris perintah. Urutan yang tidak dirender kosong - dan garis kosong yang dihasilkan dilewatkan kembali ke:indent
.sumber
manperl(){ man $1 | perl -00ne "print if /^\s*$2\b/"; }
dan kemudianmanperl sh SYNOPSIS
ataumanperl sh read
:)sed 'H;$!d;g;s/\(\(\n *\)match\([^\n]*\)\2 \)\{1,\}\)*.\{,1\}/\1/g'
... mungkin itu bekerja ... tetapi itu membutuhkan menelan file dan menguraikan semuanya sekaligus. Ini berfungsi dalam aliran - ia dapat menangani input dengan ukuran berapa pun asalkan garisnya tidak terlalu panjang. Mencetak karena bekerja - dan mem-parsing semuaman
's\b
ackslash lolos boot. Tetapiman
hanya satu aplikasi untuk itu - Saya telah menerapkan sebagian besar untuk masalah lain juga ...\n\n
bukan\n
tetapi masih dapat menangani input ukuran dan cetak saat bekerja. Lihat "mode paragraf" di sini: perldoc.perl.org/perlrun.htmlsed
hal itu dapat dilakukan seperti:'/./{H;$!d' -e '};x;now work the paragraph...'
. Saya juga sering melakukan itu. Tapi saya awalnya menulis bagian pertama untuk menonton log secara langsung untuk waktu yang tidak terbatas, dan bahkan perilaku itu rapuh - buffer dapat meledak dalam kondisi tertentu. Itu hanya setengah dari ukuran ini -man
membuatnya lebih sulit. Saya melihatman -H
setelah mendapatkanman
synop di atas, dan saya pikir mungkin lebih mudah untuk bekerja dengan HTML genetika mesin yang dapat dicetak groff pada sistem GNU. Saya sudah sedalam sikumansed cmd DESCRIPTION
mendapat bagian DESCRIPTION - dan semua yang termasuk. Pencarian yang cocok dicetak seluruhnya dan seolah-olah level indentanya berada di atas. Bahkan melompati positif palsu dengan mengabaikan paragraf yang cocok tetapi kemudian tidak membuat indentasi lebih lanjut. Ini cocok dengan argumennya melalui backspace warna yang lolos dan tidak mengatasinya sampai siap untuk mencetak garis. Semua itu sangat sulit bagi saya untuk dilakukan dengan lebih banyak data daripada satu baris sekaligus.Setiap shell memiliki set builtin sendiri. Meskipun ada kesamaan, mereka masing-masing memiliki kekhasan masing-masing yang perlu didokumentasikan.
Pada sistem seperti Linux dan FreeBSD (dan OSX, yang mewarisi dari FreeBSD) di mana setiap shell disediakan sebagai paket terpisah, tidak ada halaman manual untuk builtin; sebaliknya, masing-masing builtin didokumentasikan dalam halaman manual shell. Jadi bacalah halaman manual bash untuk dokumentasi bash's
kill
builtin, bacalah halaman manual dasbor untuk dokumentasi dasbor bashkill
, dll. Ada juga halaman manual untukkill
utilitas mandiri.Lihat Bisakah saya mendapatkan halaman manual untuk perintah bash builtin? untuk
man
fungsi yang memperlihatkan dokumentasi internal bash alih-alih halaman manual jika argumennya adalah nama builtin.Ada varian unix yang menyediakan halaman manual untuk builtin shell - pada kenyataannya, sebagian besar varian komersial melakukannya. Itu layak karena sistem dilengkapi dengan satu shell, atau satu set shell yang dikenal. Halaman manual membahas perbedaan antara shell. Sebagai contoh,
fg(1)
halaman manual pada Solaris 10 memiliki bagian untuksh
,ksh
dancsh
. Thefg(1)
man halaman di AIX 7.1 referensi “Korn shell” dan “POSIX shell” tapi membahas mereka bersama-sama (mereka terjadi untuk mendukung fitur yang sama persis untukfg
). Thefg(1)
man halaman di Tru64 5.0 membahas yang ksh builtin dan mengacu pengguna csh kecsh(1)
halaman manual. SCORupanya datang dengan satu shell. Anda dapat menginstal shell lain sebagai paket tambahan pada sistem operasi ini; jika Anda menggunakan shell khusus, Anda harus ingat bahwa halaman manual untuk builtin tidak akan relevan ketika menggunakan shell non-default.sumber