1

bash関数を定義しようとしていますmycd。この関数は連想配列を使用しますmycdar。キーが配列に存在する場合、関数はディレクトリをキーの対応する値に変更します。キーが存在しない場合は、コマンドラインで指定されたディレクトリに変更されます。

私がやりたいのは、関連付けられた配列の両方のキーから、または現在のディレクトリに存在するフォルダから、この関数を完成させることです。

ありがとうございました。

4

2 に答える 2

2

最初のコマンド:

mycd() { [ "${mycdar[$1]}" ] && cd "${mycdar[$1]}" || cd "$1"; }

2番目の完了コマンド

_mycd() {
    local cur;
    _cd ;
    _get_comp_words_by_ref cur;
    COMPREPLY=($(
        printf "%s\n" "${!mycdar[@]}" |
            grep ^$cur)
        ${COMPREPLY[@]});
    }

1つのアレイ:

declare -A mycdar
mycdar['docs']=/usr/share/doc
mycdar['home']=$HOME
mycdar['logs']=/var/log
mycdar['proc']=/proc
mycdar['root']=/
mycdar['tmp']=/tmp

最後にバインドよりも:

complete -F _mycd -o nospace mycd

または、標準のパス構築動作を許可するには:

complete -F _mycd -o nospace -o plusdirs mycd

mycdarただし、これはパス配列に対しては機能しません。

于 2012-10-28T20:02:58.470 に答える
1

求められていることを正確に実行する完全な機能に対するオプションがあることがわかりました。

complete -o plusdirs -o nospace -F _mycd mycd

この場合_mycd、連想配列のキーから一致する要素を返すだけです。

于 2012-10-28T23:53:52.520 に答える