5

私は次のディレクトリ構造を持っています:

base/
  dir/
    subdir/
    link -> ../dir

ここで、dir / linkにcdして、次のように入力します。

cd ../subd[tab]

私は得る:

cd ../subdir[space] 
  1. オートコンプリートが失敗するかどうかはわかります(パスを正規化し、dir/ではなくbase/を調べるため)。

  2. また、末尾が/でオートコンプリートされるかどうかもわかりますcd ../subdir/(dir /として解釈..されgo up one level、検索されるため)。

しかし、私は2つの間のどこかにある実際の動作を理解していません。理想的には、bashを2のように動作させたいと思います(cd ../subdir/へのオートコンプリート)。私はfedora14、bashバージョン4.1.7(1)を使用しています。これを達成する方法はありますか?

4

3 に答える 3

1

更新: オートコンプリートをカスタマイズできるプログラムは と呼ばれcompleteます。

ここでいくつかの良い基本的な例を見つけることができます: Bash Complete コマンドの使用の詳細

上記のリンクに従って関数とスクリプト名を使用し/て、ディレクトリへのシンボリックリンクに を追加するスクリプトを次に示します...これは単なる大まかなサンプルですが、実行できることを示しています(私は試していません)ビルトインcd...

関数_mycomplete_を実行可能ファイルに関連付けるmyfoo

complete -F _mycomplete_ myfoo

入る関数~/.bashrc

function _mycomplete_()
{
    local cmd="${1##*/}"
    local word=${COMP_WORDS[COMP_CWORD]}
    local line=${COMP_LINE}
    local xpat='!*.foo'

    COMPREPLY=($(compgen -f -X "$xpat" -- "${word}"))
    if ((${#COMPREPLY[@]}==1)) ;then
       [[ -h $COMPREPLY ]] && COMPREPLY="$COMPREPLY/"
    fi
}

元の答え:

コマンドラインでは、シンボリック リンクへの自動展開の主なインジケータが次の表の最後の行に表示されます。名前は展開されますが、最後の はありません/

 on pressing TAB                                         on pressing TAB (again)  
  what happens?              meaning                        what happens?
===================      =======================     ==================================== 
Nothing is appended  1=> Multiple sub-dirs exist  => A list of possibilities is presented
                     2=> No sub-directory exists  => Nothing is appended (again)

Expands to end in /   => A uniquely matching dir  => ...as per first column (repeat)
Expands text only     => Current name is a link   => Expands to end in /

あなたの例では、コマンドラインを完全な名前にすでに準備している場合、つまり. cd linkその場合、指標は明らかではありません。また、可能性のリストを介したシンボリック リンクであることもわかりません。

cdリンクのターゲットにアクセスできるようにするにはcd -P link、 、またはset -P; cd link

于 2012-04-12T11:47:35.480 に答える
0

私はUbuntuでもまったく同じ問題を抱えていました。オートコンプリートは例2のように機能していましたが、ある時点で説明したとおりに機能し始めました。パッケージbash-completionをパージして再インストールしたところ、すべてが正常に戻ったように見えます。bashをアンインストールしないでください!bash-オートコンプリートのみ。

編集

これを見てください:

https://bbs.archlinux.org/viewtopic.php?id=113158

于 2012-05-14T23:59:51.643 に答える
0

ソースコードを少し掘り下げると、これは少し複雑に見えます。実際の問題は、作業ディレクトリ内のシンボリックリンクを許可する bash (pwd -L および pwd -P を参照) と、物理ディレクトリにない場合に一致するタイプを決定できない readline との混合です。

readline/complete.c:1694

s = (nontrivial_match && rl_completion_mark_symlink_dirs == 0)
? LSTAT (filename, &finfo)
: stat (filename, &finfo);

stat() は、../ が論理パスではなく物理パスに対して相対的であると認識されるため、失敗します。readline は、これがディレクトリであると判断できないため、最後の '/' を追加しません。非常によく似た問題がここで説明されています

今のところ、既存の動作で生活できると思います...

于 2012-04-13T16:14:05.557 に答える