web-dev-qa-db-ja.com

長いmanページの読み取りと検索

bashread-sオプションにman bashを付けて読みたいと思ったときに、うんざりしました。私は最終的に正しい場所(4500行目あたり)を見つけましたが、/read/\s-s\sの両方の検索で一致が多すぎるため、いつものようにイライラしました。

したがって、問題は、どうやって長いmanページを効率的に読むか、または他の方法で同じ情報を取得できるか、locallyですか?具体的な例として、シェルスクリプトでread -s pwdを確認した後、関連するドキュメントにアクセスする方法を教えてください。良い答えは、シェルスクリプトスニペット、またはツールとその使用方法についてのヒント、または完全に別の何かである可能性があります。

注:私は bash でタグ付けしていません。これは、おそらく最も一般的に遭遇する巨大なmanページであっても、manページの読み取り全般に関する質問にしたいためです。

32
hyde

Bashビルトインのヘルプをすばやく入手するには、helpを使用します。

help read

あなたが欲しいものです。

マンページのようなフォーマットには、

help -m read

または、さらに良いことに、

help -m read | less

それでもmanページでそれを探していると主張する場合、コマンドの説明がすぐに見つかる理由がわかります。

/^\s*read [[]

これが機能するのは、コマンドが最初に説明されるとき、その名前が行の先頭からわずかにインデントされているためです。 readの特定のケースでは、実際のreadのドキュメントに到達するまでに少し閲覧する必要があります。これは、(明らかな理由により)Wordの「読み取り」がmanページ全体で何度も繰り返されるためです。 [[]は、通常オプションのパラメータの前にある[に一致することを意味します。 (私は通常/ ^\s *を省略し、単に/ <built-in command> [[]を実行します)

別の選択肢

形式の変更を気にしない場合は、manページをDVIまたはPDFファイルに変換できます:

man -T dvi bash >bash.dvi

または

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

もちろん、DVIまたはPDFドキュメントを指定すると、簡単にテキスト検索を実行できます。

33
Joseph R.

アプローチ1

man bash/read \[/-s

アプローチ2

explainshell と呼ばれるコマンドライン引数を説明するオープンソースツールを試すことができます。

ローカルで使用できます。 https://github.com/idank/explainshell のドキュメントを読む

警告:通常は機能しますが、Ubuntuのマンページリポジトリにあるコマンドでのみ機能します

あなたの場合、-sread -s pwdスイッチを認識できません。

アプローチ3

有望に思える別のツールを見つけましたが、私のシステムでは機能しません。

説明:Unixコマンドの短いドキュメント

9
Ivan Chau

この場合、私が通常行うことは、manを実行し、Shell BUILTIN COMMANDS見出しを検索してから、組み込みを検索することです。

man bash
/^Shell BUILTIN
/  read 

ただし、bashでは次のことができます

help read

または、システムに応じて、次のいずれか

man 1 read
man bash-builtins

一般的に、これを行うために he ( "short help")というスクリプトがあります。次のように実行します。

he bash read
8
Mikel

BashのmanページのシェルBUILTINS COMMANDSセクションに直接ジャンプするには、$HOME/.bash_aliasesファイルに次のエイリアスを定義します。

alias man-builtin="man -P 'less -p ^Shell\ BUILTIN\ COMMANDS' bash"
1
trellem

どのLinuxディストリビューションからでも、情報がmanページと同じであるアクションのタイプごとに別々の段落を置きたい場合は、info bashを使用できるはずです。

0
admstg

私は目的のために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
  )
}

コメントはそれが何をするかについて少し説明します。特定のデフォルトの検索文字列は、指定されたWordを行頭から検索し、最初のスペースをスキップします。例:

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

注:このスクリプトには、マニュアルページセクションの概念はありません...後で調整するかどうかを確認しますが、MANSECT環境変数manを設定すると役立ちます。

0
hyde

他のディスカッションの断片をまとめる here これは、組み込み関数(存在する場合)に直接アクセスできる.bashrcに残すことができる簡単な関数です。それ以外の場合は、通常どおりmanを開きます。

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

別の選択肢を提供するために、現在のページを簡単に検索できるWebブラウザーを使用したい場合は、 man.cgi などを使用して、freeBSD.orgでmanを表示することもできます。異なるシステムのページを参照して、それらの違いを確認してください。他のサイトでも似たようなものを見たので、他にもバリエーションがあると思います。

Aproposの下のヘルプリンクには、スクリプトのコピーを取得するための情報があり、manページのコレクションをダウンロードするためのリンクが付いた、独自のサーバーに配置できます。

0
sambler