cd .. en la carpeta raíz

44

¿Por qué cd .., escrito en la carpeta raíz, no advierte o falla con un error?

Yo esperaría:

/$ cd ..
-bash: cd: ..: No such file or directory

En cambio, me quedo en /. Por supuesto, esto se debe a ..que existe en /, y es simplemente /igual .. Me pregunto por qué es así.

Llevar una vida de soltero
fuente
66
No hay respuesta, pero aquí hay una buena lectura asociada, Rob Pike sobre G + que discute el origen de los archivos de puntos.
bsd

Respuestas:

53

Según el Grupo abierto (responsable del estándar POSIX):

Cada directorio tiene exactamente un directorio padre que está representado por el nombre punto-punto en el primer directorio. [...] A qué se refiere el nombre de archivo dot-dot en relación con el directorio raíz está definido por la implementación. En la Versión 7 se refiere al directorio raíz en sí; Este es el comportamiento mencionado en POSIX.1-2008. En algunos sistemas en red, la construcción /../hostname/ se usa para referirse al directorio raíz de otro host, y POSIX.1 permite este comportamiento.

(Fuente)

Centelleos
fuente
29

No obtiene un error porque incluso el /directorio tiene una entrada de directorio válida .., pero a diferencia de otros directorios, apunta al directorio en sí y, por lo tanto, se comporta de manera idéntica a .:

$ ls -lid / /. /..
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /.
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /..
$

Como la primera columna indica, ., .., y /todos tienen el mismo nodo-i-número y por lo tanto son las mismas entradas del sistema de archivos.

Entonces, incluso si estás cd ..dentro de /ti, solo quédate /.

Andreas Wiese
fuente
13
La pregunta pregunta por qué.. está ahí la entrada del directorio.
Nick Matteo
3
La única razón que me viene a la mente es que desea tratarla /como cualquier otra carpeta, incluida una entrada válida para ... De lo contrario, tendría que tratar de manera /diferente en comparación con todas las demás carpetas del sistema.
Dohn Joe
15

Está ahí porque eliminarlo requeriría crear código de manejo de casos especiales en el núcleo y las bibliotecas C. En este momento puede asumir que siempre habrá un '.' y '..' en cualquier directorio al que vaya.

El único código de caso especial requerido en este momento está en el código de montaje del sistema de archivos, donde el código anula el valor de inodo de '...' para apuntar al directorio que contiene el punto de montaje, ya que los directorios raíz no siempre son directorios raíz.

usuario65905
fuente
Después de todo, es imposible que la 'referencia de padres' en las estructuras de árbol esté libre de cualquier manejo de casos especiales, ¿no es así? La raíz tiene que ser especial por definición, y cualquier intento de enmascarar que dará lugar a casos especiales o confusión en otros lugares.
musiphil
@musiphil En unix, los casos especiales aquí se mezclan con el mountcomando y su archivo especial asociado /etc/fstab.
luser droog
1

Otra forma de verificar qué .y ..en /realidad es:

$ readlink -f ..
/home

$ readlink -f /.
/

$ readlink -f /..
/

Como puede ver, .y ..se señala /.

Cuonglm
fuente
1

Otra razón '...' está en / es que si no estuviera allí, crearía otro caso especial: el directorio raíz tendría un enlace duro menos que todos los demás directorios (todos los nodos del directorio tienen n + 2 enlaces, donde n es el número de subdirectorios directos dentro). Esto rompería varios programas que dependen para optimizar los análisis de directorios.

cov
fuente
0

Es bueno que esté allí, porque de lo contrario no podría enviar spam ../../../../a la raíz desde una carpeta. Si no permitiera ..en la raíz, entonces estaría atascado contando el número de carpetas en el directorio de trabajo.

Skylar Ittner
fuente
10
¿Qué tiene de malo cd /?
Bach
@Bach A veces, el macerado de teclado es más divertido. Además, en muchas circunstancias no estás tratando de ir a la raíz, en cuyo caso ../es mejor usarlo . También hago muchas operaciones de archivos en PHP, donde no puedo hacerlo /por varias razones.
Skylar Ittner
2
La otra cara es que tal vez accidentalmente ingresas demasiados ../sy operas (o eliminas) un archivo que no intentaste sin error.
jamesdlin
44
Repetir ../más veces de lo necesario y desear que funcione según lo previsto me parece un error lógico (inactivo), incluso si el sistema de archivos aparentemente lo permite.
musiphil
@musiphil escribir espacios entre comandos - es un error lógico (se supone que todos los espacios entre tail -f | grep son obligatorios). La mayoría de las personas con UNIX lo padecen. Escribir '../ ..' parece un problema popular de Windows (de manera predeterminada, cmd comienza en X: \ Windows y debe enviar spam ... desde el principio). ¿Por qué curar un pequeño problema cuando hay uno más grande? (espacios)
kagali-san