19181


CentOS 6.7, Ubuntu 15.04
のそれぞれで以下のコマンドを実行すると、`man`ページ(セクション1のみ)の概要一覧を意図通りに表示できます。

(Ubuntu での実行例: `manpage-ja`をインストールしているのでところどころ日本語で表示されています)

[code]

    $ for filename in /usr/share/man/man1/*.1.gz; do cmd=`basename $filename .1.gz`; man -f $cmd; done
    2to3-2.7 (1)         - Python2 to Python3 converter
    2to3-3.4 (1)         - Python2 to Python3 converter
    2to3 (1)             - Python2 to Python3 converter
    411toppm (1)         - convert Sony Mavica .411 image to ppm
    Mail (1)             - send and receive Internet mail
    ...
    zless (1)            - 圧縮されたテキストを CRT で見るためのファイル閲覧フィルタ
    zlib-flate (1)       - raw zlib compression program
    zmore (1)            - 圧縮されたテキストを CRT で見るためのファイル閲覧フィルタ
    znew (1)             - .Z ファイルを再圧縮して .gz ファイルにする
    zsoelim (1)          - satisfy .so requests in roff input
    
[/code]

これが`freeBSD-10.2-stable`で実行した場合、全く想定外の挙動をしました。

[code]

    $ for filename in /usr/share/man/man1/*.1.gz; do cmd=`basename $filename .1.gz`; man -f ${cmd:-}; done
    c2ph(1), pstruct(1)      - Dump C structures as generated from "cc -g -S" stabs
    biff(1)                  - be notified if mail arrives and who it is from
    ctm_smail(1), ctm_dequeue(1), ctm_rmail(1) - send and receive ctm(1) deltas via mail
    forward(5)               - mail forwarding instructions
    from(1)                  - print names of those who have sent mail
    ...
    ...
    [: nothing appropriate
    ...
    ...
    tblgen(1)                - Target Description To C++ Code Generator rst2man-indent-level 0 1 rstReportMargin \$1 
    [an-margin] level 
    [rst2man-indent-level] level margin: 
    [rst2man-indent
    [rst2man-indent-level]] - 
    [rst2man-indent0] 
    [rst2man-indent1] 
    [rst2man-indent2] . 1 INDENT RS \$1 nr rst2man-indent
    [rst2man-indent-level] 
    [an-margin] nr rst2man-indent-level +1 . UNINDENT RE rst2man-indent-level -1 
    [rst2man-indent
    [rst2man-indent-level]]u
    tcsh(1)                  - C shell with file name completion and command line editing
    xstr(1)                  - extract strings from C programs to implement shared strings
    DynaLoader(3)            - Dynamically load C libraries into Perl code
    ExtUtils::CBuilder(3)    - Compile and link C code for Perl modules
    ExtUtils::Constant(3)    - generate XS code to import C header constants
    ExtUtils::Constant::XS(3) - generate C code for XS modules' constants
    ExtUtils::Embed(3)       - Utilities for embedding Perl in C/C++ applications
    ExtUtils::Miniperl(3)    - write the C code for perlmain.c
    ExtUtils::ParseXS(3)     - converts Perl XS code into C code
    Fcntl(3)                 - load the C Fcntl.h defines
    List::Util::XS(3)        - Indicate if List::Util was compiled with a C compiler
    XSLoader(3)              - Dynamically load C libraries into Perl code
    c2ph(1), pstruct(1)      - Dump C structures as generated from "cc -g -S" stabs
    --More-- (byte 2220)
    
[/code]

`man -f` としているだけなのにどういうわけか途中でページャ(`more`)によるユーザー入力待ち状態になってしまいます。

確かに FreeBSD の`man`を見ると`man
-f`は`whatis(1)`コマンドを実行し、その`whatis`は環境変数`PAGER`の影響を受けると書かれていました。ページャデフォルトが`more`であるとも。

しかし`man -f` を単体で動作したときにはページャ表示に切り替わってユーザー入力待ちとなるような動作は確認できませんでした。

[code]

    $ man -f c2ph
    c2ph(1), pstruct(1)      - Dump C structures as generated from "cc -g -S" stabs
    
[/code]

コマンドの仕様について分かってないとか、実行コマンドの書き方に問題があるとか、そういうことだろうと思って調べてみたものの理解が及びません。ご教示お願いいたします。


CC BY-SA 4.0
2015-11-22T22:51:42.743
19176
2022-08-03T02:35:55.897
2022-08-03T02:35:55.897
3060
9403
question
freebsd man
FreeBSD で man -f の挙動が Linux と異なる

[code]

    $ for filename in /usr/share/man/man1/*.1.gz; do cmd=`basename $filename .1.gz`; man -f $cmd | cat; done
    
[/code]

するか、

[code]

    $ for filename in /usr/share/man/man1/*.1.gz; do cmd=`basename $filename .1.gz`; PAGER=cat man -f $cmd; done
    
[/code]

でいけませんか？

[code]

    $ man -f perl
    
[/code]

とかするとなんとなく感じがつかめるかも。


CC BY-SA 3.0
2015-11-23T01:30:47.387
19181
2015-11-23T01:44:00.633
2015-11-23T01:44:00.633
62
62
19176
answer


本題とは関係がないのですが、

> manページ(セクション1のみ)の概要一覧を意図通りに表示できます。

Ubuntu Linux の `whatis` コマンドでは指定したセクションに属するコマンドの概要を表示するオプションスイッチがあります。

> **whatis(1)**
>
> -s list, --sections list, --section list  
>  Search only the given manual sections. list is a colon- or comma-separated
> list of sections.
>
> -w, --wildcard  
>  Interpret each name as a pattern containing shell style wildcards.
>
> -r, --regex  
>  Interpret each name as a regular expression.

例えば、Section 1 のみの概要を表示する場合は以下のようにします。

[code]

    $ whatis -s 1 -w '*'
    or
    $ whatis -s 1 -r '.*'
    
[/code]

一方、FreeBSD の `whatis` にはこの様なオプションはありませんが、

> **whatis(1)**
>
> The keyword is simply passed to grep(1) allowing for extended regular
> expression matches.

となっていますので、例えば、

[code]

    # Section 1
    $ whatis '^[^(]+\(1\)'
    
    # Section 1 or 3
    $ whatis '^[^(]+\([13]\)'
    
[/code]

などとする事によってセクションをある程度は絞り込む事ができます。


CC BY-SA 3.0
2015-11-23T03:55:22.900
19183
2015-11-23T03:55:22.900
19176
answer