Все встроенные оболочки имеют одну и ту же страницу руководства:
BUILTIN(1) BSD General Commands Manual BUILTIN(1)
NAME
builtin, !
и т.п.
Затем есть небольшой текст, описывающий встроенные функции оболочки, а затем список, который выглядит примерно так:
Command External csh(1) sh(1)
! No No Yes
% No Yes No
Но если мы делаем, man grep
мы получаем такие разделы, как
- ошибки
- история
- Смотрите также
- стандарты
- Описание
и т.п.
Не имеют ли встроенные команды оболочки свою историю, описание и аргументы типа -A
или -r
? Почему это не предусмотрено на страницах руководства и как я могу научиться использовать их правильно и эффективно?
command-line
osx
freebsd
man
Отображаемое имя
источник
источник
Ответы:
Потому что встроенные функции являются частью оболочки. Любые ошибки или история, которую они имеют, являются ошибками и историей самой оболочки. Они не являются независимыми командами и не существуют вне оболочки, в которую они встроены.
Эквивалентом, по
bash
крайней мере, являетсяhelp
команда. Например:У всех встроенных команд bash есть
help
страницы. Дажеhelp
самаВдохновленная сценарием @ mikeserv
sed
, вот небольшая функция, которая будет печатать соответствующий раздел справочной страницы, используя Perl. Добавьте эту строку в файл инициализации вашей оболочки (~/.bashrc
для bash):Затем вы запускаете его, предоставляя ему страницу руководства и название раздела:
источник
SHELL BUILTIN COMMANDS
разделеbash
справочной страницы. Их "man-страницы" естьhelp builtin_name
.man git commit
вызывается страница руководстваgit-commit
. Нечто подобноеman bash if
было бы замечательно .Хотя это правда, что некоторые встроенные оболочки могут иметь скудное отображение в полном руководстве - особенно для тех
bash
специфических встроенных функций, которые вы, скорее всего, будете использовать только в системе GNU (люди GNU, как правило, не верятman
и предпочитают свои собственныеinfo
страницы) - подавляющее большинство утилит POSIX - встроенных в оболочку или других - очень хорошо представлены в Руководстве программиста POSIX.Вот отрывок из нижней части моего
man sh
(который, вероятно, 20 страниц или около того ...)Все те , есть и другие , не упомянутые , такие как
set
,read
,break
... ну, мне не нужно , чтобы назвать их всех. Но обратите внимание(1P)
на нижний правый угол - он обозначает серию руководств по POSIX категории 1 - этоman
страницы, о которых я говорю.Может быть, вам просто нужно установить пакет? Это выглядит многообещающе для системы Debian. Хотя
help
это полезно, если вы можете найти его, вы обязательно должны получить этуPOSIX Programmer's Guide
серию. Это может быть чрезвычайно полезно. И это составляющие страницы очень подробны.Кроме того, встроенные функции оболочки почти всегда перечислены в определенном разделе руководства по конкретной оболочке.
zsh
например, для этого есть целая отдельнаяman
страница - (я думаю, что она насчитывает около 8 или 9 отдельныхzsh
страниц, в том числеzshall
огромных).Вы можете просто
grep
man
конечно:... что довольно близко к тому, что я делал при поиске на
man
странице оболочки . Но в большинстве случаевhelp
это довольно хорошоbash
.Я на самом деле работал над
sed
сценарием, чтобы справиться с такими вещами в последнее время. Вот как я схватил раздел на картинке выше. Это все еще дольше, чем мне нравится, но оно улучшается - и может быть довольно удобным. В своей текущей итерации он довольно надежно извлекает контекстно-зависимый раздел текста в соответствии с заголовком раздела или подраздела на основе [a] pattern [s], заданного им в командной строке. Он окрашивает свой вывод и печатает на стандартный вывод.Это работает, оценивая уровни отступа. Непустые строки ввода обычно игнорируются, но когда он встречает пустую строку, он начинает обращать внимание. Он собирает строки оттуда до тех пор, пока не проверит, что текущая последовательность определенно отступает дальше, чем ее первая строка, прежде чем появится другая пустая строка, или же он отбрасывает поток и ждет следующего пробела. Если тест пройден успешно, он пытается сопоставить ведущую строку со своими аргументами командной строки.
Это означает , что матч шаблон будет соответствовать:
..а также..
..но нет..
..или..
Если совпадение может быть выполнено, оно начинает печатать. Он уберет начальные пробелы совпавшей линии со всех строк, которые он печатает, поэтому независимо от уровня отступа, он обнаружит, что линия на нем печатает его так, как если бы он был сверху. Он будет продолжать печатать до тех пор, пока не встретит другую строку на уровне отступа, равном или меньшем, чем у соответствующей строки - поэтому целые разделы будут взяты только с совпадением заголовка, включая любые / все подразделы, абзацы, которые они могут содержать.
Таким образом, в основном, если вы попросите его сопоставить с шаблоном, он будет делать это только с каким-либо предметным заголовком и раскрасит и напечатает весь текст, найденный в разделе, возглавляемом его совпадением. Ничего не сохраняется, так как он делает это, кроме отступа первой строки - и поэтому он может быть очень быстрым и обрабатывать
\n
ввод, разделенный на электронные строки, практически любого размера.Мне потребовалось некоторое время, чтобы выяснить, как использовать следующие подзаголовки:
Но я разобрался со временем.
Мне все же пришлось переделать все это ради простоты. Хотя раньше у меня было несколько маленьких циклов, которые делали в основном одни и те же вещи немного по-разному, чтобы соответствовать их контексту, меняя способы рекурсии, мне удавалось дублировать большую часть кода. Теперь есть две петли - одна печать и одна проверка отступа. Оба зависят от одного и того же теста - цикл печати запускается при прохождении теста, а цикл отступа вступает во владение, если он не выполняется или начинается с пустой строки.
Весь процесс очень быстрый, потому что большую часть времени он просто
/./d
выбирает любую непустую строку и переходит к следующей - даже результатzshall
мгновенного заполнения экрана. Это не изменилось.Во всяком случае, пока это очень полезно. Например,
read
вышеописанное можно сделать так:... и он получает весь блок. Он может принимать любые шаблоны или что угодно, или несколько аргументов, хотя первым всегда является
man
страница, на которой он должен искать. Вот картина некоторых из его результатов после того, как я сделал:... оба блока возвращаются целыми. Я часто использую это как:
... для чего это весьма полезно. Кроме того, получение
SYNOPS[ES]
делает это действительно удобным:Вот если ты хочешь сделать это - я не буду винить тебя, если ты этого не сделаешь.
Вкратце, рабочий процесс:
\n
символа ewline, удаляется из вывода.\n
символы ewline никогда не появляются в пространстве входных паттернов. Их можно получить только в результате редактирования.:print
и:indent
оба являются взаимозависимыми замкнутыми циклами и являются единственным способом получить электронную\n
линию.:print
Цикл цикла начинается, если ведущие символы в строке представляют собой серию пробелов, за которыми\n
следует символ ewline.:indent
Цикл начинается на пустых строках - или на:print
строках цикла, которые терпят неудачу#test
- но:indent
удаляет все\n
начальные пустые + электронные строки из своего вывода:print
он начнется, он продолжит вытягивать входные строки, обрезать начальные пробелы до величины, найденной в первой строке своего цикла, преобразовывать экранирование избыточного удара и обратного удара обратного пробела в побеги цветных терминалов и печатать результаты до тех пор, пока#test
не произойдет сбой.:indent
он сначала проверяетh
старое пространство на предмет возможного продолжения отступа (такого как подраздел) , а затем продолжает вводить данные до тех пор, пока происходит#test
сбой, и любая строка, следующая за первой, продолжает совпадать[-
. Если строка после первой не совпадает с этим шаблоном, она удаляется - и впоследствии все последующие строки до следующей пустой строки.#match
и#test
соединить две замкнутые петли.#test
проходит, когда\n
начальная серия заготовок короче, чем серия, за которой следует последняя электронная линия в последовательности строк.#match
присоединяет ведущее\n
ewlines необходимого для начала:print
цикла любых из:indent
«s выходных последовательностей , которые приводят спичку в любой командной строке арг. Те последовательности, которые не отображаются пустыми - и полученная пустая строка передается обратно:indent
.источник
manperl(){ man $1 | perl -00ne "print if /^\s*$2\b/"; }
и затемmanperl sh SYNOPSIS
илиmanperl sh read
:)sed 'H;$!d;g;s/\(\(\n *\)match\([^\n]*\)\2 \)\{1,\}\)*.\{,1\}/\1/g'
... возможно, это работает ... но для этого нужно проглотить файл и проанализировать все сразу. Это работает в потоке - он может обрабатывать ввод любого размера, если строки не астрономически длинные. Он печатает , как это работает - и он разбирает всеman
«s\b
ackslash ускользает для загрузки. Ноman
это всего лишь одно приложение - я применил его и к другим проблемам ...\n\n
вместо,\n
но все равно может обрабатывать ввод любого размера и печатать, как это работает. Смотрите «режим абзаца» здесь: perldoc.perl.org/perlrun.htmlsed
нем можно сделать так:'/./{H;$!d' -e '};x;now work the paragraph...'
. Я тоже часто так делаю. Но я изначально написал первую часть для просмотра журнала в течение неограниченного времени, и даже такое поведение было ненадежным - буфер может взорваться при определенных условиях. Это было только вдвое меньше -man
стало сложнее. Я посмотрелman -H
после полученияman
описанного выше синопа и думаю, что, возможно, будет проще работать с машинным HTML, который groff может печатать в системах GNU. Я вроде как по локоть уже thougmansed cmd DESCRIPTION
получает раздел ОПИСАНИЕ - и все включенные. Совпадающий поиск печатается целиком, как будто его уровень отступа был верхним. Он даже пропускает ложные срабатывания, игнорируя параграфы, которые соответствуют, но затем не отступают дальше. Он сопоставляет свои аргументы через цветовые экранированные символы и не обрабатывает их до тех пор, пока он точно не будет готов напечатать строку. Все это очень трудно для меня сделать с большим количеством данных, чем одна строка за раз.Каждая оболочка имеет свой набор встроенных функций. Хотя есть общие черты, у каждого из них есть свои особенности, которые необходимо задокументировать.
В таких системах, как Linux и FreeBSD (и OSX, которая наследуется от FreeBSD), где каждая оболочка предоставляется в виде отдельного пакета, нет man-страницы для встроенных функций; вместо этого каждое встроенное задокументировано в справочной странице оболочки. Так что прочитайте справочную страницу bash для документации по
kill
встроенной функции bash , прочитайте справочную страницу dash для документации поkill
встроенной функции dash и т. Д. Есть также справочная страница дляkill
автономной утилиты.См. Могу ли я получить отдельные страницы руководства для встроенных команд bash? для
man
функции, которая показывает внутреннюю документацию bash вместо страницы руководства, если аргумент является именем встроенной функции.Существуют варианты Unix, которые предоставляют справочные страницы для встроенных команд оболочки - на самом деле, большинство коммерческих вариантов делают. Это возможно, потому что система поставляется либо с одной оболочкой, либо с набором известных оболочек. На странице руководства обсуждаются различия между оболочками. Например,
fg(1)
страница на Solaris 10 имеет секции дляsh
,ksh
иcsh
. Страницаfg(1)
man в AIX 7.1 ссылается на «оболочку Korn» и «оболочку POSIX», но обсуждает их вместе (они поддерживают одинаковые функцииfg
). Страницаfg(1)
man на Tru64 5.0 обсуждает встроенную ksh и отсылает пользователей csh кcsh(1)
странице man. ШОСпо-видимому, поставляется с одной оболочкой. Вы можете установить другие оболочки в качестве дополнительных пакетов в этих операционных системах; Если вы используете собственную оболочку, вы должны помнить, что страницы руководства для встроенных команд не будут релевантными при использовании оболочки не по умолчанию.источник