3

Bash では、引数内のコマンド名とファイル名を TAB キーで補完できます。しかし、コマンドに共通のオプションも含めないのはなぜですか? さらに良いことに、オプションが何をするかを教えてくれる補完システムもありませんか?

プログラマブル補完について聞いたことがあります..しかし、それがどこに適合するのかわかりません..

私の質問は次のとおりです。私が求めていることを達成する方法はありますか? Bash と組み合わせる他のツールは、おそらく..または何か?

4

7 に答える 7

5

さらにすばらしい完成度が必要な場合は、zshを調べてください。これは bash によく似ており、ksh、tcsh などの優れた機能をいくつか取り入れています。また、bash の厄介なバグのいくつかを修正しています。

scp のリモート ファイル名の補完 (キーベースの認証が設定されている場合) や、タブ補完時のミニ ドキュメントなど、非常に優れた機能を実行できます。 :

[steven@sexy:~]% jar <tab>
0  -- store only without using ZIP compression
M  -- do not create manifest file
etc...
于 2009-12-13T18:31:23.107 に答える
2

bashOS X では、 MacPorts を使用して事前定義された補完のセットを簡単にインストールできます。手順はこちらです。の例を見ると、/opt/local/etc/bash_completion.d追加の例を作成するためのアイデアが得られるかもしれません。

于 2009-12-13T18:27:13.060 に答える
2

bash の公式マニュアル ページは次のとおりです: Bash Reference Manual: Programmable Completion

于 2009-12-13T13:45:49.893 に答える
1

これは bash の標準機能です:プログラマブル補完

于 2009-12-13T13:14:17.513 に答える
1

Bash は引数の補完をサポートしています: http://www.debian-administration.org/articles/316

于 2009-12-13T13:15:10.243 に答える
1

Bash 補完は非常にカスタマイズ可能で、一般的なコマンドのオプションを表示できます。構成ファイルはそのように指定するだけです。Debian では、bash 補完には、さまざまなコマンドのオプションを補完するさまざまな構成ファイルのセットが付属しています。

例えば:

alanhaggai@neon:~$ tar
A  c  d  r  t  u  x
于 2009-12-13T13:15:19.323 に答える
0

ここでの回答はどれも気に入らないので、具体的な例をいくつか提供したいと思います。

共通のプレフィックスを持つディレクトリがいくつかある場合があり、ディレクトリ名の途中または最後にあるディレクトリ名の一意の部分を入力するだけで、それらに cd して補完できるようにしたいと考えていました。

これを達成するための補完関数を書くことができました:

_cd(){
    # Backup old nullglob setting
    local shoptbakup="`shopt -p nullglob`"
    shopt -s nullglob

    local cur opts i opt
    local IFS=$'\n'
    cur="${COMP_WORDS[COMP_CWORD]}"

    # Home directory substitution
    if [[ "${cur:0:1}" == '~' ]]; then
        cur="$HOME/${cur:1}"
    fi

    if [[ $cur == */* ]]; then
        opts=(${cur}*/)
    else
        opts=(*${cur}*/)
    fi

    # Prevent trailing//
    i=0
    for opt in "${opts[@]}"; do
        #opts[$i]=${opt%${opt##*[!/]}}
        opts[$i]=${opt%/}
        i=$((i+1))
    done

    # Restore nullglob setting
    eval "$shoptbakup" 2>/dev/null

    COMPREPLY=("${opts[@]}")
}
complete -o filenames -o bashdefault -o nospace -F _cd cd

だから今、私のプロンプトからこれを行うことができます:

$ ls
test 6/  test 7/  test 8/  test1/  test2/  test3/  test4/  test5/
$ cd 7[TAB]

そして、次のように自動的に完了します。

$ cd test\ 7/

プログラマブル補完を使用するもう 1 つの理由は、スクリプトを記述し、オプションを一覧表示または補完できるようにする場合です。このページには、本当に良い例がいくつかあります。

http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html

次に例を示します。

listanimals というスクリプトがあるとします。オプションの入力を支援する補完関数を書くことができます

# complete sendevent
_listanimals()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local prev=${COMP_WORDS[COMP_CWORD-1]}

    if [[ $prev == "--sort-direction" ]]; then
        COMPREPLY=( $( compgen -W "horizontal vertical" -- $cur ) )
        return 0
    elif [[ $prev == "--type" ]];then
        COMPREPLY=( $( compgen -W "mammals reptiles birds fish marsupials insects misc" -- $cur ) )
        return 0
    elif [[ $prev == "--size" ]]; then
        COMPREPLY=( $( compgen -W "tiny small medium large huge" -- $cur ) )
        return 0
    fi


    # completing an option
    if [[ "$cur" == --* ]] || [[ $cur == "" ]]; then
        COMPREPLY=( $( compgen -W "--sort-direction --type --size" -- $cur ) )
    fi
}
complete -F _listanimals listanimals

今、私はこれを行うことができます:

$ listanimals --[TAB][TAB]
--size            --sort-direction  --type
$ listanimals --t[TAB]

これは自動的に次のように入力されます:

$ listanimals --type

次に、これを行うことができます:

$ listanimals --type [TAB][TAB]
birds       fish        insects     mammals     marsupials  misc        reptiles

そして、あなたは残りを理解できると確信しています。これは実用的な例なので、試してみたい場合は、ファイル (例: sample.sh) にコピーして貼り付け、 bash でソース化してsource sample.shください。実際には、listanimals という名前のスクリプトは必要ありません。

理解するのが面倒だと思ったので、誰かがこれを役に立つと思ってくれることを願っています。

于 2014-05-07T23:25:50.950 に答える