2012-05-04 35 views
24

Supongamos que tengo las carpetas ~/a/b en mi carpeta de inicio, y la carpeta b contiene un enlace simbólico a '..' llamado 'symlink'. Entonces realizar las siguientes acciones en bash:Comportamiento de cd/bash en enlaces simbólicos

[email protected]:~$ cd a/b/symlink 
[email protected]:~/a/b/symlink$ pwd -P 
/home/hm/a 
[email protected]:~/a/b/symlink$ cd .. 
[email protected]:~/a/b$ pwd -P 
/home/hm/a/b 

-P pwd imprime el directorio actual de trabajo, eliminación de referencias a todos los enlaces simbólicos. ¿Por qué el directorio de trabajo/home/hm/a/b está al final, y no/home/hm?

Respuesta

26

bash está siendo "amigable"; cuando cd /into/a/symlink/, la cáscara recuerda la antigua ubicación (en $OLDPWD) y usará que directorio cuando cd .. bajo el supuesto de que desea volver al directorio que eran sólo en.

Si desea utilizar el verdadera.., entonces también debe utilizar cd -P:

  The -P option says to use the physical directory 
      structure instead of following symbolic links (see 
      also the -P option to the set builtin command); 
      the -L option forces symbolic links to be followed. 
$ cd 
$ cd a/b/symlink 
$ cd -P .. 
$ pwd -P 
/home/sarnold 
$ 
+8

FYI, puede usar 'set physical' -o o' set -P' para hacer este comportamiento permanente. – Kevin

+1

.. Debo mencionar que la implementación probablemente esté más en línea con la descripción de @ geekosaur; No esperaría que sobrescribir 'OLDPWD' con tu propio valor influya en el comportamiento de' cd ..'. – sarnold

+0

Estoy de acuerdo en que no creo que OLDPWD haga nada aquí. Lo probé "cd" bajando una cadena de enlace simbólico tres niveles de profundidad y luego haciendo "cd .." un par de veces. Funcionó bien Si se usó OLDPWD, no funcionaría. OLDPWD solo recuerda un directorio y no se pudo usar para volver a más de un directorio. Por lo tanto, OLDPWD no se usa. –

4

bash realiza un seguimiento de la ruta del directorio lógico actual, como se muestra en el mensaje, e interpreta cosas como cd .. según eso. Esto hace las cosas un poco más consistentes si solo utiliza tales rutas en cd (o pushd), a costa de que ocurran cosas inesperadas si luego espera que ocurra lo mismo con las rutas en los argumentos de comando (o dentro de los comandos; emacs y vim tienen sus propias reglas configurables para el manejo de enlaces simbólicos, pero la mayoría de los comandos dependen del kernel para manejarlo).

Cuestiones relacionadas