すべて抽出しようとしています。コマンドの要約/usr/share/man/man1
マニュアルページから:
#!/usr/bin/env bash
## synopses - extract all synopses in /usr/share/man/man1
cd /usr/share/man/man1
for i in *.gz; do
echo "$i:" | sed -E "s/.1.gz|.gz//g"
man "./$i" | sed -n '/^SYNOPSIS/,/^[A-Z][A-Z][A-Z]/p' | sed -e '1d; $d' | tr -s [:space:]
done
...これは以下を提供します一部成功の尺度 - コマンドの出力全体を次のように取得します。ㅏ到着ジ。しかし、私はまた多くのエラーを経験しました。標準エラーfor i in ./*.gz; do man "$i"
そしてfor i in *.gz; do man "./$i"
ファイルに出力するとき( synopses > file
) 1 :
<standard input>:27: expected `;' after scale-indicator (got `o')
<standard input>:29: expected `;' after scale-indicator (got `o')
<standard input>:283: name expected (got `\{'): treated as missing
<standard input>:674: warning: macro `as',' not defined (possibly missing space after `as')
<standard input>:174: name expected (got `\{'): treated as missing
<standard input>:161: warning [p 1, 5.5i]: can't break line
<standard input>:594: warning [p 5, 3.8i, div `an-div', 0.0i]: can't break line
<standard input>:569: warning [p 6, 0.0i]: can't break line
<standard input>:147: warning [p 1, 1.8i]: can't break line
<standard input>:205: warning [p 2, 0.2i]: can't break line
<standard input>:525: warning [p 5, 4.5i]: can't break line
<standard input>:157: warning [p 1, 4.8i]: can't break line
<standard input>:351: warning [p 3, 1.8i, div `an-div', 0.0i]: can't break line
<standard input>:147: a space character is not allowed in an escape name
man: can't open man1/zshmisc.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshexpn.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshparam.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshoptions.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshbuiltins.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshzle.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshcompwid.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshcompsys.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshcompctl.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshmodules.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshcalsys.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshtcpsys.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshzftpsys.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshcontrib.1: No such file or directory
man: -:423: warning: failed .so request
<standard input>:423: can't open `man1/zshmisc.1': No such file or directory
<standard input>:424: can't open `man1/zshexpn.1': No such file or directory
<standard input>:425: can't open `man1/zshparam.1': No such file or directory
<standard input>:426: can't open `man1/zshoptions.1': No such file or directory
<standard input>:427: can't open `man1/zshbuiltins.1': No such file or directory
<standard input>:428: can't open `man1/zshzle.1': No such file or directory
<standard input>:429: can't open `man1/zshcompwid.1': No such file or directory
<standard input>:430: can't open `man1/zshcompsys.1': No such file or directory
<standard input>:431: can't open `man1/zshcompctl.1': No such file or directory
<standard input>:432: can't open `man1/zshmodules.1': No such file or directory
<standard input>:433: can't open `man1/zshcalsys.1': No such file or directory
<standard input>:434: can't open `man1/zshtcpsys.1': No such file or directory
<standard input>:435: can't open `man1/zshzftpsys.1': No such file or directory
<standard input>:436: can't open `man1/zshcontrib.1': No such file or directory
これらの<standard input>
エラー(エスケープエントリ?)とは何man
ですか?なぜファイルが見つからないのですか?どうすればより強力で効率的にすることができますか?
1. エラーがあるようです。標準エラー同じデータにどの実装/ソリューションを使用しても同じです。これはすごくそうです。
答え1
君はただ走れないあなたのように見えたできる実行中ですが、man foo.gz
man foo.1.gz
使用する方が-l
きれいに見えます。からman man
:
-l, --local-file
Activate `local' mode. Format and display local manual files
instead of searching through the system's manual collection.
Each manual page argument will be interpreted as an nroff source
file in the correct format. No cat file is produced. If '-' is
listed as one of the arguments, input will be taken from stdin.
When this option is not used, and man fails to find the page
required, before displaying the error message, it attempts to
act as if this option was supplied, using the name as a filename
and looking for an exact match.
したがって、スクリプトは次のようにする必要があります。
#!/usr/bin/env bash
## synopses - extract all synopses in /usr/share/man/man1
## No need to cd into the directory, you can just use globs
for i in /usr/share/man/man1/ajc*.gz; do
## This will print the name of the command.
basename "${i//.1.gz}"
man -l "$i" |
awk '/^SYNOPSIS/{a=1; getline}
(/^[a-zA-z0-9_]/ && a==1){a=0}
(a==1 && /./){print}' | tr -s [:space:]
done
私が与えたコマンドはawk
あなたのアプローチ(テストなどman ajc
)よりもうまく機能し、今では複数行の要約でも機能します。表示されるエラーのほとんどはマイナーであり、他のエラーはファイル名の処理方法によって発生します。これがうまくいくかどうか教えてください。
答え2
発生したエラーに関して、すべてここで解決されました。
man man
MANWIDTH
-$MANWIDTH
設定されている場合、その値はマニュアルページをフォーマットする必要がある行の長さとして使用されます。設定しないと、マニュアルページは現在の端末に適した行長にフォーマットされます(使用可能な場合はioctl(2)値を使用する$COLUMNS
か、両方が使用できない場合は80文字に置き換えます)。 Catページは、デフォルトの形式が利用可能な場合、つまり端末行の長さが66から80文字の間にのみ保存されます。
MAN_KEEP_FORMATTING
- 通常、出力が端末(ファイルやパイプなど)として指定されていない場合は、特別なツールなしで結果を読みやすくするためにフォーマット文字が削除されます。ただし、$MAN_KEEP_FORMATTING
NULL以外の値に設定すると、これらの書式文字は保持されます。これは、書式設定文字を解釈できるmanラッパーに役立ちます。
MAN_KEEP_STDERR
- 通常、出力が端末(通常はページャ)に渡されると、マニュアルページのフォーマットされたバージョンを生成するために使用されたコマンドの誤った出力は、ページャの表示を妨げないように削除されます。このようなプログラムは、groff
マニュアルページと一緒に表示されたときに見苦しく、しばしば混乱する印刷問題(誤ったソートなど)に関する比較的マイナーなエラーメッセージを生成することがよくあります。ただし、一部のユーザーはこれを見たいので、$MAN_KEEP_STDERR
null以外の値に設定するとエラー出力が通常どおり表示されます。
次に、他のタスクを実行する方法について説明します。
私はこれがあなたの要件を満たしていると思います。
for f in /usr/share/man/man1/*gz ; do
man -P "sed -ne '1,/^[Nn]/d;/^ /{H;b}
/^[Ss]..[Yy]..[Nn]/{g;:n
N;/\n\(\n\)[^ ].*/!bn;s//\1/
s/.\x08//g;s/\(\n\) */\1/g;
w /dev/stderr' -ne '};/./q'" -l "$f"
done 2>~/file
次の行のみを出力するように指定しますsed
。PAGER
名前そして次の人要約他のEphemerに会うまで<space>
。それは印刷する何もない最初の行が<space>
次から始まらない場合名前不一致が始まります[Ss][Yy][Nn]
。それぞれの場合、2行目のファイルの読み取りを完全に停止します。名前で始まらない<space>
。出力から先行スラッシュ<spaces>
とすべてのバックスラッシュを消去します。\b
for
私はこれを繰り返し実行しましたが、ライブラリman
全体を見るのに1分しかかかりませんでした。
man
端末に書き込むかパイプ/ファイルに書き込むかによって出力を調整します。したがって、これを行うように指示すると、ポケットベルを完全に放棄します。これは予期しないことです。しかし、私はそれをだまして、sedのw
rite関数を使用して>&2に書き込んでリダイレクトしたので、合理的ではありませんでした。
しかし、@terdonがおそらくより良いアプローチであることに注意することが重要です。各ファイルをインポートするので、カスタマイズしやすく、sed
端末の幅に合わせようとしないため、フォーマットは少し良いですが、明らかにman
\ backslashesは書きません|pipe
。