Como obtenho bash para respeitar minha estrutura de diretório físico? (E também para o Emacs?)

4

Se no bash, eu faço " set -P ", então o bash segue o "diretório físico estrutura "ao fazer" pwd "e" cd .. "etc, ao invés do" lógico um "que pode ser definido via links simbólicos. Infelizmente, o bash ainda não obedece a estrutura de diretório física para conclusão do nome do arquivo. Como posso obter bash para respeitar minha autoridade nesta questão?

Obrigado!
| > ouglas

P.S. Infelizmente, o mesmo problema agora afeta o Emacs para abrir arquivos, etc. Se alguém também sabe como dizer ao Emacs para respeitar minha estrutura de diretórios físicos, então eu também gostaria de saber a resposta para isso.

P.P.S. Eu não sei quem decidiu que ter alguns programas tentam entender sua "estrutura de diretórios lógicos" foi uma boa idéia, mas é não! Não, a menos que você possa convencer todos os programas do mundo a fazer as coisas dessa maneira, já que alguns programas usam o seu físico estrutura de diretórios e ter outros usando seu diretório lógico estrutura é uma receita para confusão e aborrecimento.

    
por Douglas 05.01.2010 / 22:33

2 respostas

3

Obrigado pelas respostas anteriores. Mas, na verdade, " set -P " faz o trabalho bem por si só, contra a minha pergunta original sobre o assunto.

Quando eu estava originalmente tentando isso, eu devo ter de alguma forma entrado em um estado confuso onde a conclusão do nome do arquivo não estava respeitando a configuração " set -P ". Mas agora com uma nova festa, tudo está funcionando bem. " set -P " parece colocar o bash no modo "estrutura de diretórios físicos" consistentemente durante todo o bash.

    
por 07.01.2010 / 06:34
1

Isso pode fazer você parte do caminho até lá.

Use type -a _expand e compare sua saída com a função abaixo. A função existente deve corresponder à parte que está após o primeiro else abaixo. Se não, você pode embrulhar o que você tem no exterior if...else como você o vê aqui.

Cole-o em um prompt do Bash para testar. Então, se estiver satisfeito, coloque-o no arquivo ~/.bashrc para substituir a definição da função em /etc/bash_completion (em vez de editá-lo diretamente).

_expand ()
{
    if [[ $- == *P* && -L "$cur" && -d "$cur" ]]; then
        cd "$cur";
        eval cur="$PWD";
        cd - > /dev/null;
    else
        if [[ "$cur" == \~*/* ]]; then
            eval cur=$cur;
        else
            if [[ "$cur" == \~* ]]; then
                cur=${cur#\~};
                COMPREPLY=($( compgen -P '~' -u $cur ));
                [ ${#COMPREPLY[@]} -eq 1 ] && eval COMPREPLY[0]=${COMPREPLY[0]};
                return ${#COMPREPLY[@]};
            fi;
        fi;
    fi
}

Isso é um apoio indireto na função de expansão de til da conclusão da guia do Bash.

Agora você pode fazer

ls -l symdir<TAB>

e você verá

ls -l /dest/dir<CURSOR>
    
por 06.01.2010 / 01:14