[Pluto-help] La bash mi inganna con il tab! Perchè?

Marco Cova giardini a libero.it
Gio 24 Maggio 2001 02:24:10 CEST


"Pandini Alessandro - Dip. di Scienze dell'Ambiente e del Territorio"
wrote:
[CUT]
> Conclusione della (troppo lunga) chiacchierata:
> -quando sto digitando il comando, la bash mi considera nella (inesistente)
> directory ~/cn e mi lascia vedere ciò che ho nella ~ (per questo funziona
> l'autocompleting!)
> -quando esegue il comando la bash considera che io mi trovo in ~/film/coen
> e mi grida vendetta...
Ciao.
Se non ho capito male, la situazione è la seguente:
in $HOME ci sono:
lista/
film/coen/
cn/ (che è un link necessariamente [1] soft a ../film/coen)

Se fai:
cd cn; mv * ../lis[TAB]
almeno qualitativamente bash scende di un livello arrivando in $HOME e
cerca di fare una completion basandosi sui file in quella directory [2].
A questo punto si imbatte in lista/ (che è una directory, ma a questo
punto è inessenziale) e quindi completa il tuo comando in questo modo:
mv * ../lista
A questo punto, bash fa una fork seguita da una exec e carica mv cui
arrivano come argomenti l'espansione di * (tutti i file nella dir
corrente) e ../lista Bash, arrivati a questo punto, non gioca più alcun
ruolo.
Il problema è capire perché nella completion ../ equivale a $HOME e in
altri casi a $HOME/film [3]. Il trattamento dei link è un po'
particolare dal punto della programmazione: i sistemi UNIX mettono a
disposizione delle funzioni, in C ovviamente, apposite (tipo lstat,
lseek etc), il cui comportamento è diverso dalle controparti non
l-prefissate (ad esempio stat e seek). Forse in questo caso l'uso che ne
è stato fatto è incoerente (o almeno così mi sembra). Ma questa è solo
una congettura (fatta ad un'ora tarda e quindi nemmeno troppo
attendibile :-)).

Aspettando illuminazioni da qualcuno più esperto,
Marco.


[1] solo root può creare link hard a directory, cosa da fare con
*estrema* prudenza. I problemi nascono quando si creano dei loop: se la
dir A contiene B e questa è un link hard ad A, come si fa ad eliminare
B? Meglio non provarci!
[2] maggiori info in man bash alla voce completion
[3] ad esempio:
cd ..; pwd dà come esito $HOME (cd è uno shell builtin command)
source ../lista dice file non esistente (cerca in $HOME/film), anziché
lamentarsi che è una directory (in $HOME) (come sopra)
touch ../test crea il file test in $HOME/film (touch è un programma, non
un builtin command della shell)
Mmh, un bel po' di confusione :-(




More information about the pluto-help mailing list