[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

liens symboliques



Charles Goyard writes:
 > Salut
 > 
 > J'ai un petit problème troublant avec les liens symboliques:
 > 
 > ~$ ls -l
 > [...] exemple1.tex
 > [...] to_workdir -> /usr/local/workdir/
 > 
 > j'ai donc un lien 'to_workdir' qui pointe vers /usr/local/workdir
 > 
 > si je fais:
 > 
 > ~$ cd to_workdir/
 > ~/to_workdir$ cp ../exemple1.tex .
 > cp: cannot stat `../exemple1.tex': Aucun fichier ou répertoire de ce type
 > ~/to_workdir$ ls ../exemple1.tex  
 > ls: ../exemple1.tex: Aucun fichier ou répertoire de ce type
 > ~/to_workdir$ ls ../exemple1.tex
 > ~/to_workdir$ cd ..
 > ~$ ls exemple1.tex 
 > exemple1.tex
 > 
 > les commandes remontent d'un répertoire sans suivre le lien symbolique par
 > lequel je suis arrivé. Ce qui est troublant, c'est que je tape:
 > 
 > ls ../exemp [TAB] et il complète le nom.
 > par contre, il ne trouve pas le fichier.
 > 
 > Est-ce un bug, une fonctionnalité, une limitation?

C'est un fonctionnement tout à fait normal. Les commandes cp et ls
sont des commandes externes, elles exploitent donc les structures
réelles de l'arborescence du système de fichier pour fonctionner. Ton
répertoire /usr/local/workdir/ a pour seul et unique répertoire parent 
le répertoire /usr/local/ c'est pourquoi les commandes cp et ls n'y
trouvent aucun fichier dénommé exemple1.tex.

Par contre la commande cd et la completion automatique sont des
fonctionnalités internes du shell, pour des raisons d'optimisations,
elles exploitent de préférence la variable PWD du shell. Cette
variable est mise à jour lors des opérations cd, et refléte donc le
chemin par lequel tu as accéder à un répertoire et non son accès réel
depuis la racine du système de fichier. Il peut donc y avoir une
différence entre ta variable PWD et ta "localisation" réelle.

Exemple: si tu tapes les commandes suivantes:
cd
cd to_workdir/
Tu te retrouves dans ton répertoire to_workdir
En tapant la commande pwd (ou echo $PWD qui revient au même) tu
afficheras ta variable PWD qui vaudra /home/toto/to_workdir (en
supposant que ton home soit /home/toto/).
Mais si demande le chemin d'accès réel par la commande pwd EXTERNE
/bin/pwd tu obtiendras /usr/local/workdir 

Les commandes internes du SHELL ne travaillent que sur la variable
PATH en se basant sur les occurences du charactère /
Exemple: lorsque tu tapes ls ../exemp[TAB] pour la cmpletion
automatique, ton shell prend sa variable PWD qui vaut
/home/toto/to_workdir , enlève le dernier nom de répertoire car ta
demande de completion commence par ../, ton shell obtient alors le
chemin d'accès /home/toto/ dans lequel il va bien trouver un fichier
exemple1.tex avec lequel il pourra t'offrir un solution de
completion. 


 > 
 > Ceci arrive avec bash (2.04.0(1)-release).
 > 
 > tcsh me fait, quand à lui:
 > pounk:~> cd to_workdir/
 > pounk:~/to_workdir> cd ..
 > pounk:/usr/local>

La commande cd de tcsh exploite la structure des répertoires et non
la variable interne PWD, alors que la commande cd cd bash n'utilise
que la variable PWD, ce qui explique la différence de
comportement. Mais ce sont là des comportements par défaut, il existe
peut être des options pour modifier cela, à vérifier...


 > Des suggestions?
 > Est-il possible de demander aux programmes de suivre le chemin que l'on a
 > suivi pour arriver dans un répertoire plutot que de suivre le chemin
 > physique (sans utiliser de liens durs) ?

Les liens dur sont interdits sur les répertoires, justement à cause de 
l'unicité du répertoire parent.

En fait, la majorité des programmes exploitent le chemin physique,
car l'appel système chdir() se base uniquement sur le chemin
physique. Pour qu'un programme suive le chemin d'accès suivi et non
le chemin physique, il faut implanter en interne une gestion complète
du PWD, c'est ce que fait bash.


Bon, voila, j'espère ne pas avoir été trop confus. Sinon, dis moi où
l'explication te pose problème.

A++

FSP


-- 
Frederic S. PARAIN - PhD Student - Projet SOLIDOR
IRISA-INRIA, Campus de Beaulieu, 35042 Rennes cedex, France
Tél: +33 (0) 2 99 84 75 34, e-mail: Frederic.Parain@irisa.fr
"Everything should be as simple as possible, but not simpler"



Reply to: