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


32

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

したがって、質問は次のとおりです。長いmanページを効率的に読むには、またはローカルで他の方法で同じ情報を取得するにはどうすればよいですか。具体的な例として、read -s pwdシェルスクリプトで確認した後に関連ドキュメントにアクセスする方法は?適切な答えは、シェルスクリプトスニペット、またはツールとその使用方法についてのヒント、または読むための適切な場所を見つけるのに役立つ限り、まったく別のものです。

注:タグ付けすることはありません。なぜなら、質問はおそらく最も一般的に見られる巨大なmanページですが、manページの読み取りに関する質問にしたいからです。


これはあなたの要件の範囲外かもしれないので、これを答えとしてはいませんが、長いmanページを読む必要があるときは、上部パネルに残す小さなスクリプトを使用します。 yuugian.com/demo/gkman.txt 共有してお楽しみください
Yuugian

私はどちらかの答えとしてこれを入れていないよ;)それは確かにについてですので、bash自分自身:ちょうどあなたのように、私はあまりにもほとんど必要SHELL BUILTINS行程度であるマニュアルの一部、3500。これを知っているので、次回私が言ってman bashから66パーセント下がったときは、と入力して66%からPgDnを数回押して、そこにいます。「ルート66」として記憶できるため66を選択しましたが、実際には電話番号の先頭でない限り暗記するのはそれほど簡単ではありませんが、実際にはそれより少し大きいです。 」は普遍的であり、世界中で知られています。
構文エラー

回答:


33

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

help read

あなたが望むものです。

マンページのようなフォーマットの場合、使用

help -m read

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

help -m read | less

それでもmanページでそれを探すことに固執するなら、私はすぐにコマンドの説明に私を導くものを見つけます

/^\s*read [[]

これは、コマンドが最初に説明されるときに、その名前が行の先頭からわずかにインデントされるために機能します。の特定の場合read、これは実際のreadドキュメントに到達する前に少しブラウジングします。(明らかな理由で)単語「読む」がマニュアルページ全体で繰り返されるためです。[[]は、通常オプションのパラメーターの前にある[と一致することを意味します。(私は通常/ ^ \ s *を省き、単純に/ <組み込みコマンド> [[])を実行します)

別の選択肢

形式の変更を気にしない場合は、manページを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について聞いたことはありますか?
ジョセフR.

索引または目次、その「ptx」は私が意図したものとまったく同じように聞こえます。
ハイド

1
別の、さらに簡単な代替手段は、「man bash> bashman.txt」を実行することです。次に、テキストエディタの(別の)ウィンドウでbashman.txtを開き、必要なものを見つけるためにすべてのコマンドを使用できます。ファイルを編集して、最も頻繁に参照するセクションのタグを追加することもできます。bashman.txtを読み取り専用にすることで、エディターで誤って変更することがなくなります。
ジョー

また、選択したブラウザでマニュアルページを開き、そのツールをすべて使用することもできます。askubuntu.com/questions/339255/を
Joe

9

アプローチ1

man bashそれ/read \[から/-s

アプローチ2

コマンドライン引数を説明するための、explainshellというオープンソースツールを試すことができます

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

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

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

アプローチ3

私は有望な別のツールを見つけましたが、それは私のシステムでは動作しません。

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


アプローチ1では、次の/-s\bようなヒットを回避することができます--some-other-command(スペースなどで-s,検索した場合には取得できないのような文字列を検索します/-s)。
デビッドクニペ

8

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

man bash
/^SHELL BUILTIN
/  read 

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

help read

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

man 1 read
man bash-builtins

一般に、これを行うためのスクリプトhe(「短いヘルプ」)があります。次のように実行します。

he bash read

参考までに、名前descをに変更しましたhegithub.com/mikelward/scripts/blob/master/he
ミケル

3

マニュアルの情報を見つける一般的な方法はありません。本の情報を見つける一般的な方法があります。それはあなたが探しているものに依存します。

シェルのビルトインに関する情報を探している場合、インデントを保存する行の先頭でビルトインを検索し、その後にスペースを続けることができます:検索^ *read␣(例/^ *read␣ Enter)(スペース)これは、dash、pdksh、mksh、およびbashで機能します。Zshのmanページは分割されているため、zshbuiltinsmanページを読む必要があります。Ksh93には、いくつかの組み込みの名前の前に特別なシンボルがあります。UTF ^ *†*␣-8または^ *-*␣ASCIIで検索する必要があります。いくつかの誤検知がありますが、これによりすぐに正しい行に移動できます。を検索^ *read($| [-[])すると、誤検知の量が減ります。

ページャーに移動先を指示することで、検索を高速化できます。たとえばPAGER='less "+/^ *read \["' man bashreadビルトインの説明に関するbashのマニュアルページを開きます。これを関数にすることができます:

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

mkshmanページ、/ read (2つのスペース、コマンド名、1つのスペース)は通常(これは私が自分自身を使用するトリックです、そして、素早く入力でき)適切な場所を見つけました。それについてお問い合わせいただきありがとうございます。TODOのmkshに含まれるすべてのユーティリティについて、(多少)別個の参照を作成します。
ミラビロス

1
@mirabilos / read は、男性の実装がテキストを正当化するときに多くの誤検知を起こす傾向があります。
ジル「SO-悪であるのをやめる」14

同意した。組み込みのドキュメントを本当に分割するさらに多くの理由。
ミラビロス

1

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

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

0

別の代替手段を提供するために、現在のページを簡単に検索できるWebブラウザーを使用したい場合は、freeBSD.orgで使用されているman.cgiなどを使用して、さまざまなシステムのmanページを表示して、彼らは異なります。私は他のサイトでも似たようなものを見てきましたので、周りに他のバリエーションがあることを期待してください。

aproposの下のヘルプリンクは、manページコレクションをダウンロードするためのリンクを備えた独自のサーバーに配置するスクリプトのコピーを取得するための情報を提供します。


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ますが、manの環境変数を設定すると役立ちます。


2
トラップを追加して、一時ファイルをクリーンアップすることができますtrap 'rm -f "$tmp"'
。– l0b0

1
これは非常に複雑に見えます。私はあなたのスクリプトが何をするかを完全には読んでいませんman "$1" | vim -R - "+/$2"が、似たようなことはしませんか?
ジル 'SO-悪であるのをやめる'

@Gillesの最初の出現に行く$2ので、いいえ。
ハイド

@ l0b0使用するクリーンアップを変更しましたtrap。ただし、サブシェルを作成せずに関数内でそれを実行するためのクリーンな方法は見つかりませんでした。
ハイド

@hydeもちろん、正規表現を自分のやっていることに適合させます。私のポイントは、使用についてのだった+/REGEX
ジル「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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.