阅读和搜索长手册页


32

我终于想了解当厌倦了庆典read,它的-s使用选项man bash。我最终找到了正确的位置(在4500行附近),但是像往常一样令人沮丧,因为两者/read甚至/\s-s\s搜索的匹配都太多了。

因此,问题是:如何在本地有效阅读较长的手册页,或以其他方式获得相同的信息?作为一个具体示例,在看完read -s pwdShell脚本后如何到达相关文档?一个很好的答案可能是shell脚本代码段,或者提示某些工具及其使用方式,或者完全提示其他内容,只要它有助于找到正确的阅读位置即可。

注意:我不使用标记,因为我希望问题是关于手册页的一般阅读,即使这很可能是最常见的庞大手册页。


我并不是要回答这个问题,因为它可能超出了您的要求,但是:当我需要阅读一长篇文章时,man我使用了一个小脚本,我留在了上面的面板上。 yuugian.com/demo/gkman.txt 分享并享受
Yuugian

我也不是要回答这个问题;)因为它确实是关于bash自身的:就像您一样,我也非常需要SHELL BUILTINS手册的一部分,大约在3500行。知道了这一点,下次我只想说一次man bash,然后输入66%,然后下降66%,然后输入几次PgDn,我就在那里。尽管我选择66是因为可以将其记住为“ Route 66”,但实际上它还不止于此,尽管要记住它不是那么容易,除非它是电话号码的开头,等等。:)至少是“ Route 66” ”已广为人知,享誉全球。
语法错误

Answers:


33

为了快速获得有关内置Bash的帮助,请使用help

help read

是你想要的。

对于类似手册页的格式,请使用

help -m read

甚至更好

help -m read | less

如果您仍然坚持在手册页中寻找它,那么我很快就会发现我对命令的解释是

/^\s*read [[]

之所以可行,是因为在首次解释命令时,其名称从行首开始略有缩进。在特定的情况下read,在进入实际read文档之前,需要进行一些浏览,因为(出于明显的原因)在手册页中经常重复使用“ read”一词。[[]表示要匹配[通常在可选参数之前的[]。(我通常省去/ ^ \ s *并简单地执行/ <内置命令> [[])

另一种选择

如果您不介意格式更改,则可以将手册页转换为DVI或PDF文件:

man -T dvi bash >bash.dvi

要么

man -T ps bash | ps2pdf - bash.pdf # Requires the Ghostscript suite for ps2pdf

当然,对于DVI或PDF文档,您可以轻松地进行文本搜索。


嗯,那help太好了,我想知道我怎么从未听说过…… ps2pdf不是那么有用,因为它(显然)不能创建任何类型的索引。
海德

@hyde不确定创建索引的含义,但是您听说过ptx吗?
Joseph R.

在索引或目录中,“ ptx”听起来完全像我的意思。
海德

1
另一个甚至更简单的选择是执行“ man bash> bashman.txt”。然后,您可以在文本编辑器的(另一个)窗口中打开bashman.txt,并使用所有命令查找所需内容。您甚至可以编辑文件,为最常引用的部分添加标签。将bashman.txt设置为只读会有帮助,因此您不会在编辑器中无意中对其进行修改。
2013年

您还可以在所选的浏览器中打开手册页并使用其所有工具。参见askubuntu.com/questions/339255/…–

9

方法1

man bash然后/read \[/-s

方法2

您可以尝试使用开放源代码工具来解释命令行参数,称为explainshell

可以在本地使用。阅读https://github.com/idank/explainshell上的文档

警告:通常有效,但仅适用于在Ubuntu手册页存储库中找到的命令

就您而言,它无法识别的-s切换read -s pwd

方法3

我发现了另一个看似有希望的工具,但它在我的系统上不起作用。

说明:Unix命令的简短文档


使用方法1,您/-s\b可以避免类似这样的命中--some-other-command(同时仍会找到诸如的字符串-s,,如果/-s使用空格搜索则不会获得该字符串)。
David Knipe '11

8

在这种情况下,我通常要做的就是运行man,搜索SHELL BUILTIN COMMANDS标题,然后搜索内置文件,即

man bash
/^SHELL BUILTIN
/  read 

但是,您可以执行bash

help read

或者,取决于系统,

man 1 read
man bash-builtins

通常,我有一个名为he(“简短帮助”)的脚本来执行此操作。您可以这样运行它:

he bash read

仅供参考,我改名deschegithub.com/mikelward/scripts/blob/master/he
Mikel

3

在手册页中找不到信息的通用方法就是在书本中找到信息的通用方法。这取决于您要查找的内容。

当您寻找有关内置shell的信息时,您可以在一行的开头搜索该内置文件,以免缩进,并在其后跟随一个空格:搜索^ *read␣(例如type /^ *read␣ Enter)(是一个空格)。这适用于破折号,pdksh,mksh和bash。Zsh的手册页已拆分,因此您需要阅读zshbuiltins手册页。Ksh93在某些内建函数的名称之前有特殊符号,您需要以^ *†*␣UTF-8或^ *-*␣ASCII搜索。有一些误报,但这会让您快速找到正确的位置。搜索^ *read($| [-[])减少了误报的数量。

您可以通过告诉寻呼机您要去的地方来加快搜索速度。例如PAGER='less "+/^ *read \["' man bash,在read内置说明上打开bash手册页。您可以将此功能设为:

man-builtin () {
  PAGER="less '+/^ *$1(\$|\\[|-)'" man ${SHELL##*/}
}

mksh联机帮助页中/ read (两个空格,命令名称,一个空格)通常会找到正确的位置(这是我自己使用的一种技巧,可以快速键入)。感谢您的询问;我将在TODO上为mksh随附的所有实用程序制作(某种程度上)单独的参考。
mirabilos 2014年

1
/ read 当您的man实现证明文本正确时,@ mirabilos 往往会有很多误报。
吉尔斯(Gilles)'所以

同意 真正拆分内置文档的更多理由。
mirabilos 2014年

1

为了直接跳到bash手册页的SHELL BUILTINS COMMANDS部分,我在$HOME/.bash_aliases文件中定义以下别名。

alias man-builtin="man -P 'less -p ^SHELL\ BUILTIN\ COMMANDS' bash"

0

只是提供了另一种选择,如果您更喜欢使用Web浏览器来轻松搜索当前页面,则可以使用freeBSD.org上的man.cgi之类的东西,它还可以让您查看来自不同系统的手册页。他们不同。我在其他网站上也看到过类似情况,因此希望周围会有其他变化。

apropos下的帮助链接提供了一些信息,以获取脚本的副本以放置在您自己的服务器上,并提供下载手册页集合的链接。


0

为此,我开始创建bash函数。例如,可以将该片段粘贴在以下内容的末尾~/.bashrc

manfind() {
  # required args
  test "$1" -a "$2" || return 1                  

  # create temp file and get its name
  local tmp=$(mktemp /tmp/manfindXXXXXX) || return 1
  ( # subshell for trap
    trap "rm $tmp" EXIT

    # grep all matching lines with line numbers and pipe them to dialog
    if man "$1" |                   # get the whole man page
      grep -n "^\s*$2" |            # grep for the search string, with line nums
      sed 's/:/\n/' |               # replace line num separator with newline for dialog
      cut -c-70  |                  # cut long lines to nice length
      xargs -d'\n' -n 999999 \
        dialog --output-fd 3 --menu "Select line to go to" 0 0 0 3>$tmp -- 1 '(start of man page)'
    then
      # selected line number is now in $tmp, get man page and
      # use vim in read only mode to view it at right line
      man "$1" | vim -R +"$(< $tmp)" -
    else
      # cancel selected from dialog
      exit 1
    fi
  )
}

注释解释了它的作用。特别是默认搜索字符串从行首开始搜索给定的单词,跳过初始空间。例子:

# find every line which starts with 'read' followed by space
manfind bash 'read '
# research bash subshells
manfind bash '.*subshell'

注意:该脚本没有手册页部分的概念...我稍后会进行调整,但是设置man的MANSECT环境变量会有所帮助。


2
您可能想添加一个陷阱来清理临时文件:trap 'rm -f "$tmp"'
l0b0

1
这看起来非常复杂。我还没有完全阅读您的脚本的功能,但是不会man "$1" | vim -R - "+/$2"做类似的事情吗?
吉尔斯(Gilles)'所以

@Gilles我会第一次出现$2,所以没有。
海德

@ l0b0更改为使用清理trap。我没有找到一种干净的方法在没有创建子shell的情况下执行此操作。
海德

@hyde当然,使正则表达式适应您的工作。我的意思是关于使用+/REGEX
Gilles'SO-别再作恶了'

0

将其他讨论中的内容放到这里,这是一个快速功能,您可以保留其中的功能.bashrc,直接使您进入内置功能(如果存在)。否则,它将man正常打开:

man() {
    case "$(/bin/bash -c 'type -t '"$1")" in 
        builtin)
            LESS=+?"^       $1 " command -p man bash
            ;;
        *)
            command -p man $@
            ;;
    esac
}

0

在任何Linux发行版中,info bash如果您希望按操作类型创建单独的段落,并且信息与手册页相同,则应该可以使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.