web-dev-qa-db-ja.com

シェルの組み込みコマンドとキーワードに対して「man」を機能させる方法は?

特定のコマンドに関する情報を取得する場合は、常にmanコマンドを使用します。しかし、その特定のコマンドがシェル組み込みコマンドである場合、これはあまり役に立ちません。例えば:

man cd

返却値:

No manual entry for cd

私の質問は、manをすべてのシェル組み込みコマンド(cdaliashistoryなど)、およびキーワード(ifwhile[[{など)でも機能させることです。 。)?

55
Radu Rădeanu

helpコマンドを-mオプションとともに使用すると、組み込みコマンドに関する情報を擬似マンページ形式で表示できます。例えば:

help -m cd | less

cdコマンドに関する情報を、マニュアルページとほぼ同じ形式で表示します。

このコマンドから始めて、次のように.bashrcファイルの1つの関数にmanコマンドをラップできます。

man () {
    case "$(type -t -- "$1")" in
    builtin|keyword)
        help -m "$1" | sensible-pager
        ;;
    *)
        command man "$@"
        ;;
    esac
}

この後、manはすべてのシェル組み込みコマンドおよびキーワードに対しても機能します。例えば:

man :

表示されます:

NAME
    : - Null command.

SYNOPSIS
    :

DESCRIPTION
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

SEE ALSO
    bash(1)

IMPLEMENTATION
    GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)
    Copyright (C) 2011 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
65
Radu Rădeanu
man bash-builtins

これには、組み込みコマンドのヘルプスニペットが含まれますが、helpに相当するものよりわずかに圧縮された形式です。

27
Oli

開発用POSIXシステム の使用に関するマニュアルページをインストールできます。

Sudo apt-get install manpages-posix-dev

Shellビルトインのmanページを提供します。

$ type cd
cd is a Shell builtin

今、試して、

$ man cd
CD(P)                      POSIX Programmer's Manual                      CD(P)

NAME
   cd - change the working directory

SYNOPSIS
   cd [-L | -P] [directory]


...
13
souravc

この解決策は完璧に機能しますが、あなたの質問を読んだときに私が最初に考えたのは、「文字通りコマンドラインの人を使っているのは誰ですか?」誰もがGoogleだけが必要なマニュアルページではないので(無制限のスクロールなどの派手なものが得られるように)?」それから私は、Googleのサイトには通常両方のタイプのコマンドがあるので、すべてのコマンドで統一されたマニュアルページインターフェイスを提供するためにそれらを使用しないでください。したがって、この楽しさが生まれました。

これには、少なくとも1回はまだ検索していないエントリに対してインターネット接続が必要です。また、Ubuntuのデフォルトのインストールにはないこれらの2つの小さなアプリが必要です。

 Sudo apt-get install tidy html2text

これらは絶対に必要というわけではありませんが、少し見栄えを良くするのに役立ちます。 TidyはHTMLをクリーンアップし、html2textはそのhtmlをフォーマットされたテキストとしてフォーマットします(これらのサイトのほとんどはすでにテキストフォーマットされており、<pre>タグでラップされているため、通常は非常に簡単です。

あとは、これを~/.profileの最後に追加するだけです。

function iman() {
    if [ ! -d "/usr/share/iman" ]; then
        Sudo mkdir -m a=rwx /usr/share/iman
    fi
    if [ ! -f "/usr/share/iman/$1.html" ]; then
        curl "http://unixhelp.ed.ac.uk/CGI/man-cgi?$1"| tidy -n -asxml 2>/dev/null| html2text > "/usr/share/iman/$1.html"; 
    fi
    if [ -f "/usr/share/iman/$1.html" ]; then
        cat "/usr/share/iman/$1.html";
    else
        echo "Entry not found."
    fi
}

ログアウトしてから再びログインすると、次のように入力できるはずです。

iman cd

cdのマニュアルページが表示されます。

これは、ネットワーク要件を最小限に抑えるためにデータディレクトリ(/ usr/share/iman)を使用します(したがって、接続なしでも以前に見つけたエントリに対して機能します。また、このランダムなLinux manページサイトの負荷を最小限に抑えます。必要なシステムエントリが見つかりました)。これを使用しない場合は、ディスクスペースを回復するためにこれを削除する必要があります。

うまくいけば、残りはかなり簡単です。

3
krowe