Come ottengo bash per rispettare la mia struttura di directory fisica? (E allo stesso modo per Emacs?)


4

Se in bash, faccio " set -P", allora bash segue la "struttura di directory fisica" quando fa " pwd" e " cd .." ecc., Piuttosto che "quella logica" che potrebbe essere definita tramite collegamenti simbolici. Sfortunatamente, bash non obbedisce ancora alla struttura di directory fisica per il completamento del nome file. Come posso ottenere bash per rispettare la mia autorità su questo problema?

Grazie!
|> ouglas

PS Sfortunatamente, lo stesso problema ha ora afflitto Emacs per l'apertura dei file, ecc. Se qualcuno sa anche come dire a Emacs di rispettare la mia struttura di directory fisica, allora vorrei anche sapere la risposta a questo.

PPS Non so chi abbia deciso che avere dei programmi che provano a capire la tua "struttura di directory logica" è stata una buona idea, ma non lo è! A meno che tu non riesca a convincere tutti i programmi del mondo a fare le cose in questo modo, dal momento che alcuni programmi usano la tua struttura di directory fisica, e altri che usano la tua struttura di directory logica è una ricetta per confusione e fastidio.


Non capisco il problema. Non riesci ad aprire i file? Il completamento bash sta prendendo la strada sbagliata?
James Polley,

Dipende da cosa intendi per "sbagliato". Bash non sta seguendo il significato Unix di "..", che è una voce di directory reale in una directory e punta alla directory padre fisica. Invece bash sta interpretando ".." per significare "togliere una voce dal percorso che ho preso per arrivare qui". Non voglio usare questo significato stravagante. Voglio il normale significato di Unix.
Douglas,

Risposte:


3

Grazie per le risposte precedenti. Ma, in realtà, " set -P" si scopre che il lavoro va bene da solo, contrariamente alla mia domanda originale sulla questione.

Quando stavo inizialmente provando questo, dovevo in qualche modo ottenere bash in uno stato confuso in cui il completamento del nome file non rispettava l' set -Pimpostazione " ". Ma ora con un nuovo bash, funziona tutto bene. " set -P" sembra mettere bash in modalità "struttura di directory fisica" in modo coerente durante bash.


1

Questo potrebbe farti parte del percorso lì.

Usa type -a _expande confronta il suo output con la funzione qui sotto. La funzione esistente dovrebbe corrispondere alla parte successiva alla prima in elsebasso. In caso contrario, puoi avvolgere ciò che hai all'esterno if...elsecome lo vedi qui.

Incollalo al prompt di Bash per testarlo. Quindi, se sei soddisfatto, inseriscilo nel tuo ~/.bashrcfile per sovrascrivere la definizione della funzione /etc/bash_completion(invece di modificarla direttamente).

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

Questo è il sostegno alla funzione di espansione della tilde del completamento della scheda di Bash.

Adesso puoi farlo

ls -l symdir<TAB>

e vedrai

ls -l /dest/dir<CURSOR>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.