Bagaimana membuat `man` berfungsi untuk perintah dan kata kunci builtin shell?

56

Saya menggunakan manperintah sepanjang waktu ketika saya ingin mendapatkan informasi tentang perintah tertentu. Tapi ini tidak banyak membantu saya ketika perintah spesifik itu adalah shell builtin. Sebagai contoh:

man cd

pengembalian:

No manual entry for cd

Pertanyaan saya adalah: adalah mungkin untuk membuat manjuga bekerja untuk semua shell builtin perintah (seperti cd, alias, history, dll), dan kata kunci (seperti if, while, [[, {, dll)?

Radu Rădeanu
sumber
Dan mengapa echoperintah builtin tetapi memiliki halaman manual?
Parto
5
@ AvatarParto echojuga merupakan perintah sistem (executable) yang terletak di /bin. Anda dapat memeriksa ini menggunakan type -a echo. Hal yang sama terjadi dengan timedan mungkin orang lain.
Radu Rădeanu
Apakah Anda sudah menjelajah info bash?
bbaassssiiee
Anda selalu dapat menulis halaman manual Anda sendiri .
Elliott Frisch

Jawaban:

66

The helpperintah ketika digunakan dengan -mopsi dapat menampilkan informasi tentang perintah builtin dalam format pseudo-manualnya. Sebagai contoh:

help -m cd | less

akan menampilkan informasi tentang cdperintah dalam format yang hampir persis seperti di halaman manual.

Mulai dari perintah ini Anda dapat membungkus manperintah dalam satu fungsi di .bashrcfile Anda sebagai berikut:

man () {
    case "$(type -t -- "$1")" in
    builtin|keyword)
        help -m "$1" | sensible-pager
        ;;
    *)
        command man "$@"
        ;;
    esac
}

Setelah ini manakan bekerja juga untuk semua perintah dan kata kunci builtin shell. Sebagai contoh:

man :

akan ditampilkan:

NAME
    : - Null command.

SYNOPSIS
    :

DESCRIPTION
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

SEE ALSO
    bash(1)

IMPLEMENTATION
    GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)
    Copyright (C) 2011 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
Radu Rădeanu
sumber
Pendekatan yang sangat pintar! +1
phatskat
5
Jika ada executable yang di-masked oleh builtin, Anda bisa menentukan bagian tersebut. man timevs.man 1 time
Stop Harming Monica
1
... catat bahwa jika Anda adalah zshpengguna, Anda tidak beruntung: bugs.launchpad.net/ubuntu/+source/zsh/+bug/1242108 (tidak ada halaman manual yang diinstal)
Rmano
info,, help -mmengapa kita tidak dapat memiliki halaman manual yang bagus hari ini? Bagaimanapun, terima kasih!
Tor Klingberg
+1 ... bagus! Perilaku fungsi tahun agak mirip dengan apa yang terjadi melalui kelebihan fungsi di C / C ++ ... Hanya dengan anehnya man typetidak menghasilkan deskripsi opsi "-a" atau "-t" di Ubuntu 14.04.4 .... namun, mereka ada di sana!
Cbhihe
28
man bash-builtins

Ini berisi cuplikan bantuan untuk perintah bawaan, meskipun dalam format yang sedikit lebih kental daripada yang helpsetara.

Oli
sumber
Senang mendengarnya! Itu dari bagian 7 manual. Saya belum mendengar tentang halaman manual ini sampai sekarang. +1, tetapi saya tidak dapat menerima jawaban ini karena bukan itu yang saya tanyakan.
Radu Rădeanu
Di macOS High Sierra perintah itu hanyalah "man builtins"
Tony Barganski
13

Anda dapat menginstal halaman manual tentang menggunakan sistem POSIX untuk pengembangan sebagai,

sudo apt-get install manpages-posix-dev

Ini akan memberikan halaman manual untuk builtin shell.

$ type cd
cd is a shell builtin

Sekarang coba,

$ man cd
CD(P)                      POSIX Programmer's Manual                      CD(P)

NAME
   cd - change the working directory

SYNOPSIS
   cd [-L | -P] [directory]


...
souravc
sumber
3
Saya sedang menunggu seseorang datang dengan jawaban ini. Tetapi masalahnya adalah ini hanya akan bekerja untuk beberapa builtin - yang ditentukan oleh POSIX .
Radu Rădeanu
3
Bash tidak sepenuhnya mematuhi POSIX kecuali dijalankan dalam mode POSIX, jadi halaman manual ini mungkin tidak lengkap, dan mungkin salah dalam beberapa keadaan, terutama ketika menggambarkan perilaku fitur tertentu.
Chris Down
@ RaduRădeanu ya Anda benar sekali, ini akan berfungsi untuk beberapa bawaan.
souravc
3

Solusi ini bekerja dengan sangat baik tetapi sedikit bercanda juga karena hal pertama yang saya pikirkan ketika saya membaca pertanyaan Anda adalah 'Siapa yang masih benar-benar menggunakan manusia dari baris perintah? Bukankah semua orang hanya Google halaman manual yang mereka inginkan (sehingga mereka mendapatkan hal-hal mewah seperti pengguliran tak terbatas)? '. Kemudian saya menyadari bahwa situs-situs saya Google biasanya semua memiliki kedua jenis perintah jadi mengapa tidak hanya menggunakannya untuk menyediakan antarmuka halaman manual yang seragam di semua perintah. Karenanya, kesenangan ini lahir.

Ini membutuhkan koneksi Internet untuk setiap entri yang belum pernah Anda lihat setidaknya sekali. Ini juga membutuhkan dua aplikasi kecil ini yang hilang dalam instalasi default Ubuntu:

 sudo apt-get install tidy html2text

Ini tidak benar-benar diperlukan tetapi mereka membantu membuatnya terlihat sedikit lebih bagus. Tidy akan membersihkan HTML dan html2text akan memformat html itu sebagai teks berformat (yang biasanya cukup sepele karena sebagian besar situs ini sudah diformat teks dan hanya dibungkus dengan tag <pre>.

Sekarang yang perlu Anda lakukan adalah menambahkan ini ke akhir ~/.profile:

function iman() {
    if [ ! -d "/usr/share/iman" ]; then
        sudo mkdir -m a=rwx /usr/share/iman
    fi
    if [ ! -f "/usr/share/iman/$1.html" ]; then
        curl "http://unixhelp.ed.ac.uk/CGI/man-cgi?$1"| tidy -n -asxml 2>/dev/null| html2text > "/usr/share/iman/$1.html"; 
    fi
    if [ -f "/usr/share/iman/$1.html" ]; then
        cat "/usr/share/iman/$1.html";
    else
        echo "Entry not found."
    fi
}

Setelah Anda keluar dan kembali, Anda harus dapat mengetik ini:

iman cd

dan itu akan menampilkan halaman manual untuk cd.

Ini menggunakan direktori data (/ usr / share / iman) untuk meminimalkan persyaratan jaringan kami (jadi itu akan berfungsi untuk entri yang sudah Anda temukan sebelumnya bahkan tanpa koneksi; juga untuk meminimalkan beban di situs halaman manual linux acak ini Saya menemukan entri sistem yang kita inginkan juga). Jika Anda tidak menggunakan ini lagi, Anda ingin menghapusnya untuk memulihkan ruang disk.

Semoga sisanya cukup lurus ke depan.

Krowe
sumber
6
'Siapa yang masih benar-benar menggunakan manusia dari baris perintah?' Aku! dan semua orang yang harus mengunjungi pusat data (tanpa internet;))
Rinzwind
Poin yang diambil, ini tidak akan membantu Anda untuk menjadi jelas.
krowe
6
Saya akan berpikir sebaliknya, saya jarang menggunakan Google untuk mencari perintah bash. Jauh lebih cepat untuk mengetik "man command" tanpa harus meninggalkan keyboard.
laurent
alt + tab -> alt + d -> perintah akan melakukan hal yang sama tanpa mouse dan tanpa membatalkan perintah cli saat ini dan dengan menggulir dan dengan sejuta hal lain yang diberikan browser kepada Anda. Saya yakin Anda tidak akan tahu apa-apa tentang itu karena lorong Anda menggunakan situs ini dan orang lain seperti itu dari lynx ... ffs
krowe
Dalam kasus builtin, imanfungsi Anda mengembalikan output yang sama dengan man bash-builtins.
Radu Rădeanu