Как заставить `man` работать для встроенных команд оболочки и ключевых слов?

56

Я использую manкоманду все время, когда хочу получить информацию о конкретной команде. Но это не сильно помогает мне, когда эта конкретная команда является встроенной оболочкой. Например:

man cd

возвращает:

No manual entry for cd

Мой вопрос: это можно сделать manтакже работать для всех оболочки встроено команд (как cd, alias, historyи т.д.) и ключевые слова (как if, while, [[, {и т.д.)?

Раду Рэдяну
источник
И как echoполучается встроенная команда, но есть страница руководства?
Parto
5
@AvatarParto echoтакже является системной командой (исполняемой), расположенной в /bin. Вы можете проверить это, используя type -a echo. То же самое происходит timeи, возможно, с другими.
Раду Рэдяну
Вы уже исследовали info bash?
bbaassssiiee
Вы всегда можете написать свои собственные справочные страницы.
Эллиотт Фриш

Ответы:

66

Команда, helpкогда используется с -mпараметром, может отображать информацию о встроенных командах в формате псевдо-manpage. Например:

help -m cd | less

будет отображать информацию о cdкоманде в формате почти так же, как на странице руководства.

Начиная с этой команды вы можете заключить manкоманду в одну функцию в вашем .bashrcфайле следующим образом:

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

После этого manбудет работать также для всех встроенных команд оболочки и ключевых слов. Например:

man :

будет отображать:

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>
Раду Рэдяну
источник
Очень умный подход! +1
phatskat
5
Если есть исполняемые файлы, замаскированные встроенными, вы можете указать раздел. man timeпротивman 1 time
Стоп Harm Моника
1
... обратите внимание, что если вы zshпользователь, вам не так повезло: bugs.launchpad.net/ubuntu/+source/zsh/+bug/1242108 (man-страниц не установлено)
Rmano
info, help -mПочему мы не можем просто иметь хорошие страниц человека в эти дни? В любом случае, спасибо!
Тор Клингберг
+1 ... приятно! Поведение функции yr несколько напоминает то, что происходит при перегрузке функций в C / C ++ ... Только любопытно, man typeчто в Ubuntu 14.04.4 не приводится описание параметров "-a" или "-t" ... и тем не менее, они ты там!
Cbhihe
28
man bash-builtins

Он содержит фрагменты справки для встроенных команд, хотя и в несколько более сжатом формате, чем helpэквивалентный.

Оли
источник
Хорошо знать! Это из раздела 7 руководства. Я не слышал об этой странице руководства до сих пор. +1, но я не могу принять этот ответ, потому что это не совсем то, что я спросил.
Раду Рэдяну
В MacOS High Sierra эта команда просто «человек, встроенный»
Тони Баргански
13

Вы можете установить страницы руководства по использованию системы POSIX для разработки, как,

sudo apt-get install manpages-posix-dev

Он предоставит справочные страницы для встроенных команд оболочки.

$ type cd
cd is a shell builtin

Теперь попробуй,

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

NAME
   cd - change the working directory

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


...
souravc
источник
3
Я ждал, чтобы кто-то пришел с этим ответом. Но проблема в том, что это будет работать только для некоторых встроенных функций - указанных в POSIX .
Раду Рэдяну
3
Bash не строго придерживается POSIX, если не работает в режиме POSIX, поэтому эти справочные страницы могут быть не исчерпывающими и могут быть ошибочными в некоторых обстоятельствах, особенно при описании поведения определенных функций.
Крис Даун
@ RaduRădeanu да, вы абсолютно правы, это будет работать для некоторых встроенных программ.
Souravc
3

Это решение работает очень хорошо, но это немного шутка, потому что первое, что я подумал, когда прочитал ваш вопрос, было: «Кто все еще буквально использует человека из командной строки? Разве все не просто Google гугл-страницы, которые они хотят (чтобы они получили такие необычные вещи, как неограниченная прокрутка)? ». Затем я понял, что сайты, которые я обычно использую в Google, имеют оба типа команд, так почему бы просто не использовать их для обеспечения единого интерфейса man-страницы для всех команд. Следовательно, это веселье родилось.

Это требует подключения к Интернету для любых записей, которые вы еще ни разу не просматривали. Также нужны эти два небольших приложения, которые отсутствуют в стандартной установке Ubuntu:

 sudo apt-get install tidy html2text

Они не являются абсолютно необходимыми, но они помогают выглядеть немного лучше. Tidy очистит HTML, а html2text отформатирует этот html как форматированный текст (что обычно довольно тривиально, поскольку большинство этих сайтов уже отформатированы и просто заключены в теги <pre>.

Теперь все, что вам нужно сделать, это добавить это в конец ~/.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
}

После того, как вы выйдете из системы, а затем вернетесь в нее, вы сможете набрать:

iman cd

и он покажет страницу руководства для cd.

При этом используется каталог данных (/ usr / share / iman), чтобы минимизировать наши сетевые требования (поэтому он будет работать для записей, которые вы уже нашли раньше, даже без подключения), а также для минимизации нагрузки на этот случайный сайт man-страниц linux Я нашел с записями системы, которые мы хотим в этом также). Если вы больше не используете это, вы захотите удалить это, чтобы освободить место на диске.

Надеюсь, все остальное довольно просто.

krowe
источник
6
«Кто до сих пор буквально использует человека из командной строки?` Я! и все остальные, кто должен посетить центр обработки данных (без интернета;))
Rinzwind
Точка взята, это не поможет вам тогда быть ясным.
28
6
Я думаю, что противоположность, я редко использую Google для поиска команд bash. Гораздо быстрее просто набрать команду man без необходимости покидать клавиатуру.
Лоран
Команда alt + tab -> alt + d -> сделает то же самое без мыши и без отмены текущей команды cli, прокрутки и миллионов других полезных функций, которые дает вам браузер. Я уверен, что вы ничего не знаете об этом, потому что вы всегда используете этот сайт и другие подобные ему от lynx ... ffs
krowe
В случае встроенных imanфункций ваша функция возвращает тот же вывод, что и man bash-builtins.
Раду Рэдяну