web-dev-qa-db-ja.com

Shellビルトインに適切なmanページがないのはなぜですか?

すべてのShellビルトインは同じマニュアルページを共有します。

BUILTIN(1)                BSD General Commands Manual               BUILTIN(1)

NAME
     builtin, !

等.

次に、Shellビルトインが何であるかを説明する短いテキストと、次のようなリストがあります。

  Command       External    csh(1)    sh(1)
       !             No          No        Yes
       %             No          Yes       No

しかし、man grepを実行すると、次のようなセクションが表示されます

  • バグ
  • 歴史
  • こちらもご覧ください
  • 規格
  • 説明

等.

Shellビルトインには、-A-rなどの独自の履歴、説明、および引数はありませんか?なぜそれがマニュアルページに記載されていないのですか、それらを正しく効率的に使用する方法をどのように学ぶのですか?

33
DisplayName

ビルトインはシェルの一部だからです。彼らが持っているバグや履歴は、シェル自体のバグや履歴です。これらは独立したコマンドではなく、組み込みのシェルの外部には存在しません。

同等の機能は、少なくともbashの場合、helpコマンドです。例えば:

$ help while
while: while COMMANDS; do COMMANDS; done
    Execute commands as long as a test succeeds.

    Expand and execute COMMANDS as long as the final command in the
    `while' COMMANDS has an exit status of zero.

    Exit Status:
    Returns the status of the last command executed.

すべてのbashビルトインにはhelpページがあります。 help自体:

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

    Displays brief summaries of builtin commands.  If PATTERN is
    specified, gives detailed help on all commands matching PATTERN,
    otherwise the list of help topics is printed.

    Options:
      -d    output short description for each topic
      -m    display usage in pseudo-manpage format
      -s    output only a short usage synopsis for each topic matching
        PATTERN

    Arguments:
      PATTERN   Pattern specifiying a help topic

    Exit Status:
    Returns success unless PATTERN is not found or an invalid option is given.

@mikeservのsedスクリプトに触発されて、Perlを使用してマニュアルページの関連セクションを出力する小さな関数を次に示します。この行をシェルの初期化ファイル(~/.bashrc(bashの場合):

manperl(){ man "$1" | Perl -00ne "print if /^\s*$2\b/"; }

次に、manページとセクションの名前を指定して実行します。

$ manperl bash while
       while list-1; do list-2; done
       until list-1; do list-2; done
              The while command continuously executes the list list-2 as long as the last command in the list list-1 returns an exit
              status of zero.  The until command is identical to the while command, except that the test is negated; list-2 is  exe‐
              cuted  as  long  as the last command in list-1 returns a non-zero exit status.  The exit status of the while and until
              commands is the exit status of the last command executed in list-2, or zero if none was executed.

$ manperl grep SYNOPSIS
SYNOPSIS
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

$ manperl rsync "-r"
       -r, --recursive
              This tells rsync to copy directories recursively.  See also --dirs (-d).
26
terdon

各シェルには、独自の組み込みのセットがあります。共通点はありますが、それぞれに文書化する必要がある独自の特性があります。

LinuxやFreeBSD(およびFreeBSDから継承するOSX)のようなシステムで、各シェルが個別のパッケージとして提供されている場合、組み込みのマニュアルページはありません。代わりに、各ビルトインはシェルのマニュアルページに記載されています。したがって、bashのkillビルトインのドキュメントについてはbashのマニュアルページを、ダッシュのkillビルトインのドキュメントについてはダッシュのマニュアルページをお読みください。killスタンドアロンユーティリティ。

引数が組み込みの名前の場合、manページの代わりにbashの内部ドキュメントを表示するman関数については、 bash組み込みコマンドの個別のmanページを取得できますか? を参照してください。

Shellビルトインのmanページを提供するUNIXバリアントがあります—実際、ほとんどの商用バリアントが提供しています。システムには単一のシェルまたは既知のシェルのセットが付属しているため、これは実現可能です。 manページでは、シェル間の違いについて説明しています。たとえば、 fg(1) man page on Solaris 1 には、shksh、およびcshのセクションがあります。 fg(1) man page on AIX 7.1 は「Korn Shell」と「POSIX Shell」を参照していますが、それらについて一緒に説明しています(たまたま、fgとまったく同じ機能をサポートしています) )。 fg(1)のTru64 5.0のマニュアルページ は、組み込みのkshについて説明し、cshユーザーにcsh(1)のマニュアルページを紹介します。 [〜#〜] sco [〜#〜] シェルは1つしか付属していないようです。これらのオペレーティングシステムでは、他のシェルをアドオンパッケージとしてインストールできます。カスタムシェルを使用する場合、デフォルト以外のシェルを使用する場合、ビルトインのマニュアルページは関連しないことに注意してください。