5179


`man`コマンドで使われている pager が具体的にどのコマンドがどういうオプションで呼ばれているかを確認する方法はありますか？

`man man`で確認しますと

[code]

       -P  pager
              Specify  which  pager to use.  This option overrides the MANPAGER environment variable, which in turn overrides the PAGER variable.  By default, man
              uses /usr/bin/less -is.
    
[/code]

とのことなのですが、つまり`MANPAGER`→`PAGER`の環境変数を見て、どちらもなければ`/usr/bin/less
-is`が使われていると推測するしかページャーの確認方法はないのでしょうか？


CC BY-SA 3.0
2015-01-23T19:06:42.487
5178
2015-01-24T01:25:53.093
3271
question
command-line man
manコマンドが使用してるpagerの確認方法


`ps` で、man から呼び出されているコマンドを確認すると良いかと思います。

# `ps` コマンドが `f` オプションをサポートする場合

[code]

    $ ps f
      PID TTY      STAT   TIME COMMAND
    15172 pts/1    Ss     0:00 -tcsh
    15177 pts/1    S+     0:00  \_ man ls
    15186 pts/1    S+     0:00      \_ pager -s
    
[/code]

一発で出てきました。

# `ps` コマンドが `f` オプションをサポートしていない場合 (OSXとか)

`PPID` (親プロセスのPID) を引っかけて地道に確認していきます。

[code]

    % ps auxlww | grep man
    root            19868   0.0  0.0  2476424    636   ??  Ss    3:25AM   0:00.00 /usr/sbin/aslman     0     1   0  33  0 -
    root            19867   0.0  0.0  2475400    616   ??  Ss    3:25AM   0:00.00 /usr/sbin/aslman     0     1   0  33  0 -
    yasu            20660   0.0  0.0  2432784    656 s001  R+    4:18AM   0:00.00 grep man           501 20321   0  31  0 -
    yasu            20650   0.0  0.0  2442080    844 s000  S+    4:18AM   0:00.01 man ls             501 10621   0  31  0 -
    
[/code]

`man` の PID は `20650` なので、これを引っかけることにしましょう。

[code]

    % ps auxlww | grep 20650
    yasu            20679   0.0  0.0  2432784    656 s001  R+    4:19AM   0:00.00 grep 20650         501 20321   0  31  0 -
    yasu            20651   0.0  0.0  2433364   1044 s000  S+    4:18AM   0:00.00 sh -c (cd '/usr/   501 20650   0  31  0 -
    yasu            20650   0.0  0.0  2442080    844 s000  S+    4:18AM   0:00.01 man ls             501 10621   0  31  0 -
    
[/code]

`PPID` が `20650` なのは、`20651` ですね。

[code]

    % ps 20651
      PID   TT  STAT      TIME COMMAND
    20651 s000  S+     0:00.00 sh -c (cd '/usr/share/man' && /usr/bin/tbl '/usr/share/man/man1/ls.1' | /usr/bin/groff -Wall -mtty-char -Tascii -mandoc -c | (/usr/bin/less -is || true))
    
[/code]

というわけで、OSX では `/usr/bin/less -is` が起動していました。

もしかしたらもっと良い方法があるのかもしれません。(別のソフトを入れて良いのであれば、`pstree` などがあります。)

# Use the source, Luke.

ソースコードを読めば確実デス!


CC BY-SA 3.0
2015-01-23T19:29:41.377
5179
2015-01-23T19:29:41.377
76
5178
answer


**Linux OS 限定** になりますが、`strace(1)` コマンドを使う方法があります。

[code]

    $ strace -f -o man_trace -e execve man ls
    
[/code]

それぞれのオプションの意味は、簡単には以下の通りです。

> man strace(1)  
>  -f: trace child processes  
>  -o file: write the trace output to the file  
>  -e execve: trace only the execve system call

できれば strace の出力を less などのページャに繋げたいのですが、man
もページャを起動させて端末(tty)を使うことになるので、一旦ファイルに保存することにします。

man を終了させたのち、strace の出力結果を確認します。不要な部分が多いので、それらを取り除きます。  
※ 使用している grep コマンドは GNU grep です。Linux OS
系のディストリビューションではデフォルトでインストールされていると思われます。

[code]

    $ grep -P '^(?!.*(ENOENT|resumed)).*execve' man_trace
    5585  execve("/usr/bin/man", ["man", "ls"], [/* 58 vars */]) = 0
    5591  execve("/usr/bin/preconv", ["preconv", "-e", "UTF-8"], [/* 61 vars */]) = 0
    5594  execve("/usr/bin/tbl", ["tbl"], [/* 61 vars */] <unfinished ...>
    5595  execve("/usr/bin/nroff", ["nroff", "-mandoc", "-rLL=79n", "-rLT=79n", "-Tutf8"], [/* 61 vars */]) = 0
    5596  execve("/home/hoge/bin/lv", ["lv"], [/* 63 vars */]) = 0
    5597  execve("/usr/bin/locale", ["locale", "charmap"], [/* 61 vars */]) = 0
    5598  execve("/usr/bin/groff", ["groff", "-mtty-char", "-Tutf8", "-mandoc", "-rLL=79n", "-rLT=79n"], [/* 62 vars */]) = 0
    5599  execve("/usr/bin/troff", ["troff", "-mtty-char", "-mandoc", "-rLL=79n", "-rLT=79n", "-Tutf8"], [/* 63 vars */] <unfinished ...>
    5600  execve("/usr/bin/grotty", ["grotty"], [/* 63 vars */] <unfinished ...>
    
[/code]

私の場合、`PAGER=lv` としていますので lv が起動されています。  
では、以下の様にして実行するとどうなるのでしょうか。

[code]

    $ strace -f -o man_trace -e execve bash -c 'MANPAGER=more PAPGER=cat man -P "less -S" ls'
    $ grep -P '^(?!.*(ENOENT|resumed)).*execve' man_trace
    5818  execve("/bin/bash", ["bash", "-c", "MANPAGER=more PAGER=cat man -P \""...], [/* 58 vars */]) = 0
    5818  execve("/usr/bin/man", ["man", "-P", "less -S", "ls"], [/* 58 vars */]) = 0
    5830  execve("/usr/bin/less", ["less", "-S"], [/* 63 vars */] <unfinished ...>
    
[/code]

マニュアルに記載されている通り、環境変数での設定よりも `-P` オプションでの設定の方が優先されていることが判ります。  
さらに、環境変数が何も設定されていない場合には何がページャとして使われるのでしょうか。

[code]

    $ strace -f -o man_trace -e execve bash -c 'env -i man ls 2>/dev/null' &&
      grep -P '^(?!.*(ENOENT|resumed)).*execve' man_trace
    7331  execve("/bin/bash", ["bash", "-c", "env -i man ls 2>/dev/null"], [/* 58 vars */]) = 0
    7332  execve("/usr/bin/env", ["env", "-i", "man", "ls"], [/* 57 vars */]) = 0
    7332  execve("/usr/bin/man", ["man", "ls"], [/* 0 vars */]) = 0
    7342  execve("/usr/bin/pager", ["pager", "-s"], [/* 5 vars */]) = 0
    
    $ lsb_release -a
    Distributor ID: Ubuntu
    Description:    Ubuntu 14.04.1 LTS
    Release:        14.04
    Codename:       trusty
    
    $ ls -l /usr/bin/pager
    /usr/bin/pager -> /etc/alternatives/pager
    
    $ realpath /usr/bin/pager
    /usr/bin/lv
    
[/code]

Ubuntu Linux の場合は `/usr/bin/pager` が使われることになります。また、`update-alternative` コマンドで
`/usr/bin/pager`
のシンボリックリンクを張り替えることができますので、実際にページャとして使用されるコマンドはそれ次第になります(デッドリンクの場合にはエラーとなります)。


CC BY-SA 3.0
2015-01-23T23:59:46.810
5184
2015-01-24T01:25:53.093
2015-01-24T01:25:53.093
5178
answer