bashのread
と-s
オプションにman bash
を付けて読みたいと思ったときに、うんざりしました。私は最終的に正しい場所(4500行目あたり)を見つけましたが、/read
と/\s-s\s
の両方の検索で一致が多すぎるため、いつものようにイライラしました。
したがって、問題は、どうやって長いmanページを効率的に読むか、または他の方法で同じ情報を取得できるか、locallyですか?具体的な例として、シェルスクリプトでread -s pwd
を確認した後、関連するドキュメントにアクセスする方法を教えてください。良い答えは、シェルスクリプトスニペット、またはツールとその使用方法についてのヒント、または完全に別の何かである可能性があります。
注:私は bash でタグ付けしていません。これは、おそらく最も一般的に遭遇する巨大なmanページであっても、manページの読み取り全般に関する質問にしたいためです。
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ドキュメントを指定すると、簡単にテキスト検索を実行できます。
アプローチ1
man bash
、/read \[
、/-s
アプローチ2
explainshell と呼ばれるコマンドライン引数を説明するオープンソースツールを試すことができます。
ローカルで使用できます。 https://github.com/idank/explainshell のドキュメントを読む
警告:通常は機能しますが、Ubuntuのマンページリポジトリにあるコマンドでのみ機能します
あなたの場合、-s
のread -s pwd
スイッチを認識できません。
アプローチ3
有望に思える別のツールを見つけましたが、私のシステムでは機能しません。
この場合、私が通常行うことは、man
を実行し、Shell BUILTIN COMMANDS
見出しを検索してから、組み込みを検索することです。
man bash
/^Shell BUILTIN
/ read
ただし、bashでは次のことができます
help read
または、システムに応じて、次のいずれか
man 1 read
man bash-builtins
一般的に、これを行うために he
( "short help")というスクリプトがあります。次のように実行します。
he bash read
BashのmanページのシェルBUILTINS COMMANDSセクションに直接ジャンプするには、$HOME/.bash_aliases
ファイルに次のエイリアスを定義します。
alias man-builtin="man -P 'less -p ^Shell\ BUILTIN\ COMMANDS' bash"
どのLinuxディストリビューションからでも、情報がmanページと同じであるアクションのタイプごとに別々の段落を置きたい場合は、info bash
を使用できるはずです。
私は目的のために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を設定すると役立ちます。
他のディスカッションの断片をまとめる here これは、組み込み関数(存在する場合)に直接アクセスできる.bashrc
に残すことができる簡単な関数です。それ以外の場合は、通常どおりman
を開きます。
man() {
case "$(/bin/bash -c 'type -t '"$1")" in
builtin)
LESS=+?"^ $1 " command -p man bash
;;
*)
command -p man $@
;;
esac
}
別の選択肢を提供するために、現在のページを簡単に検索できるWebブラウザーを使用したい場合は、 man.cgi などを使用して、freeBSD.orgでmanを表示することもできます。異なるシステムのページを参照して、それらの違いを確認してください。他のサイトでも似たようなものを見たので、他にもバリエーションがあると思います。
Aproposの下のヘルプリンクには、スクリプトのコピーを取得するための情報があり、manページのコレクションをダウンロードするためのリンクが付いた、独自のサーバーに配置できます。