Supposons que j'ai un dossier:
cd /home/cpm135/public_html
et faire un lien symbolique
ln -s /var/lib/class .
Plus tard, je suis dans ce répertoire:
cd /home/cpm135/public_html/class
Le pwd
va me dire que je suis dedans/home/cpm135/public_html/class
Y a-t-il un moyen de savoir que je suis "vraiment" dedans /var/lib/class
? Merci
shell
symlink
cd-command
working-directory
Oliver Williams
la source
la source
fish
shell résout automatiquement le lien symbolique lorsque vous y entrezcd
.Réponses:
Selon la
pwd
configuration de votre commande, le répertoire de travail logique (sortie parpwd -L
), qui affichera l'emplacement du lien symbolique, ou le répertoire de travail physique (sortie parpwd -P
), qui ignore le lien symbolique et affiche le répertoire "réel" , peut s'afficher par défaut .Pour des informations complètes, vous pouvez faire
À l'intérieur d'un lien symbolique, cela retournera
la source
-P
drapeau était ce dont j'avais besoin. Mercitest "$(pwd -L)" = "$(pwd -P)" && echo No symlinks
(ou remplacez&& echo No symlinks
par|| echo Symlinks
).file "$(pwd)"
ne fonctionne que si le lien symbolique est le dernier composant du répertoire. Il ne détecte pas le lien symbolique de l'OP lorsqu'il est gravé sur CD/home/cpm135/public_html/class/foo/bar
. Je ne suis pas au courant de quoi que ce soit qui imprime des informations pour tous les liens symboliques dans un chemin d'accès, mais vous pouvez également utiliserrealpath .
, ce qui, à mon avis, équivaut àpwd -P
Notez que
pwd
c'est en fait un shell intégré. Selon votre shell et sa configuration, les résultats peuvent changer. Pour une solution plus portable, vous devriez utiliser/bin/pwd
. Extrait de la page de manuel:En général, vous pouvez résoudre le chemin canonique complet de tout fichier / répertoire à l'aide de
readlink -f
.readlink -f .
fonctionne similaire àpwd -P
.la source
readlink -f
n'est pas disponible sur tous les Unices (par exemple, non disponible sur OS-X)Vous êtes vraiment dedans
/home/cpm135/public_html/class
- c'est la seule réponse correcte à la question "quel est mon répertoire de travail actuel".Quand vous parlez de
/var/lib/class
… ce n’est pas vraiment votre position, mais celle du chemin que vous utilisiez auparavant .Lorsque vous exécutez
/bin/pwd
, il détermine votre répertoire de travail actuel en consultant le. et .. les répertoires (ceux listés en haut dels -la
), en déterminant quel répertoire dans .. correspond à. et puis en arrière jusqu'à ce que… et. se référer au même répertoire. Une fois que tout est fait, il sait quel est votre répertoire de travail actuel.Lorsque vous exécutez le
pwd
shell intégré, il ne suit pas cette procédure (bien qu'il puisse en effectuer une partie si nécessaire). Il se souvient du chemin que vous avez emprunté pour arriver ici. Ainsi, chaque fois que vous exécutez unecd
commande, votre shell s'en souvient dans le cadre du chemin pour vous rendre où vous êtes maintenant, etpwd
affiche ce qu'il a calculé en fonction de toutes lescd
commandes que vous avez effectuées - ce qui peut être ou non votre véritable commande. directeur de travail.Les choses peuvent devenir vraiment bizarres lorsque vous
ln -s . foo
continuezcd
à foo -/bin/pwd
vous direz que vous êtes toujours dans le même répertoire, mais le shell intégrépwd
dira que vous y êtes/foo/foo/foo/foo/foo/foo
- même si aucun répertoire de ce type n'existe vraiment. (Cela dit - vous pouvez probablementcd
en faire plus.)Une autre source de confusion existe si les répertoires sont renommés.
/bin/pwd
La modification sera immédiatement prise en compte, mais le composant intégrépwd
ne le sera pas tant que vous n’aurez pas fait quelque chose qui indique que l’ancien nom de répertoire n’a pas d’importance.la source
pwd
intégré/bin/pwd
et expliquer comment la version autonome fournit des informations plus utiles (qui peuvent répondre à la question initiale).-P
et-L
options mentionnées par d' autres réponses. En bref, certaines implémentations utilisent par défaut les unes les autres. Sur le système Centos, j’ai besoin de savoir que la commande intégrée de bash est configurée par défaut sur logique et/bin/pwd
physique, mais que les deux options acceptent les deux options de ligne de commande et s’accordent sur le résultat obtenu.ls ..
montrera le contenu de/var/lib
, pas/home/cpm135/public_html
.cd ..
est spécial: le shell effectue un suivi spécial de "comment vous y êtes arrivé" et ne fait pas réellement d'chdir("..")
appel système. En ce qui concerne le noyau, le répertoire de travail actuel de votre shell (/proc/self/cwd
) est juste un point de montage: une paire d'inodes. C'est comme un descripteur de fichier ouvert sur le répertoire, ce qui explique pourquoi renommer le répertoire ne casse pas votre shell. (cd .
pour mettre à jour la$PWD
variable du shell ). Vous faites valoir un point utile, alors je voterais ceci une fois résoluEn gros, vous demandez s’il faut montrer le chemin réel du répertoire de travail en cours. Eh bien, il y a avec python et
os.getcwd()
fonctionCe que vous voyez ci-dessous est un petit test situé dans le répertoire "VirtualBox VMs" situé dans mon répertoire personnel. En réalité, il s’agit d’un lien symbolique vers un autre répertoire situé sur un disque dur différent, monté sur
/mnt/HDD
.Comme vous pouvez le constater, python
os.getcwd()
résout le chemin réel du répertoire, pas le chemin du lien symbolique.la source