4 votos

¿Cómo obtengo bash a respetar mi estructura física? (Y además para Emacs?)

Si en bash, I do "set -P" entonces bash sigue el "directorio físico la estructura de" al hacer "pwd" y "cd ..", etc, en lugar de la "lógica uno" que puede ser definido a través de enlaces simbólicos. Por desgracia, todavía bash no obedecer a la estructura de directorio físico para el nombre de la finalización. ¿Cómo puedo obtener bash para respetar mi autoridad sobre este tema?

Gracias!
|>ouglas

P. S. por Desgracia, el mismo problema ha afligido Emacs para apertura de archivos, etc. Si alguien sabe también cómo también dígale a Emacs respecto a mi físico, estructura de directorios, entonces también me gustaría saber la respuesta a eso.

P. P. S. no sé quién decidió que, teniendo algunos programas que intentan comprender su "lógica de la estructura de directorio" fue una buena idea, pero es no! No, a menos que pueda convencer a cada programa en el mundo para hacer las cosas de esta manera, ya que algunos programas usan la física estructura de directorios, y teniendo otros utilizan su directorio lógico la estructura es una receta para la confusión y molestia.

3voto

user23754 Puntos 1

Gracias por las respuestas anteriores. Pero, en realidad, como resulta que, "set -P" hace el trabajo igual de bien por sí mismo, contra mi consulta original sobre el tema.

Cuando yo era originalmente tratando de esto, tengo que de alguna manera han conseguido bash en un estado de confusión donde nombre de archivo de finalización de no respetar el "set -P " . Pero ahora con un nuevo bash, todo trabaja bien. "set -P" parece poner bash en "estructura de directorio físico" modo consistente a lo largo de bash.

1voto

Damian Powell Puntos 162

Este se puede obtener parte del camino.

Uso type -a _expand , y comparar el resultado a la función siguiente. La función existente debe coincidir con la parte que es después de la primera else por debajo. Si no, usted puede envolver lo que tiene en el exterior if...else , como se puede ver aquí.

Pégalo en un prompt de Bash para probar. Entonces, si usted está satisfecho, la puso en su ~/.bashrc archivo para reemplazar la definición de la función en /etc/bash_completion (en lugar de editar directamente).

_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
}

Este es piggy-backing en la tilde de la expansión de la función de Bash ficha de finalización.

Ahora usted puede hacer

ls -l symdir<TAB>

y vas a ver

ls -l /dest/dir<CURSOR>

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: