¿Por qué el directorio raíz se denota con un signo /?

95

Investigué un poco sobre esto en Google, pero los resultados fueron confusos. ¿Por qué se /usa el signo para denotar el directorio raíz? ¿Hay alguna razón sólida detrás de esto?

Ruban Savvy
fuente
12
La razón es que '/' es el separador de directorio y, si bien el directorio raíz en sí mismo no tiene nombre, de la misma manera que cd /homees equivalente a cd /home/agregar /al final del nombre vacío proporciona acceso a ese directorio.
SF.
2
¿Has leído esto: en.wikipedia.org/wiki/Root_directory ?
Kevdog777
11
No tiene nombre, porque cuando se ve desde adentro, es el límite del árbol de directorios visible. La jerarquía de directorio visible podría ser simplemente un subárbol en una jerarquía más grande, como cuando las búsquedas de nombre de ruta se han modificado a través de una chroot()llamada, pero cuando se ve desde adentro, esto se abstrae.
Thomas Nyman
14
¡Porque la cadena vacía habría sido una elección horrible!
Bakuriu
3
Además de lo mencionado, el uso de / para indicar la raíz produce ciertos efectos secundarios en términos de nombres de ruta absolutos y relativos. /some/dirSIEMPRE significa que (root)/some/dirwhile some/dirsiempre es relativo al directorio de trabajo actual. Este principio también es transferible al uso de URL web.
Tor Valamo

Respuestas:

108

La barra diagonal /es el carácter delimitador que separa directorios en rutas en sistemas operativos tipo Unix. Este personaje parece haber sido elegido en algún momento de la década de 1970, y según fuentes anecdóticas , las razones podrían estar relacionadas con que el predecesor de Unix, el sistema operativo Multics , usó el >personaje como separador de ruta, pero los diseñadores de Unix ya habían reservado los caracteres >y <para indicar la redirección de E / S en la línea de comandos de shell mucho antes de que tuvieran un sistema de archivos de varios niveles. Entonces, cuando llegó el momento de diseñar el sistema de archivos, tuvieron que encontrar otro carácter para indicar la separación del elemento del nombre de ruta.

Una cosa a tener en cuenta aquí es que en el terminal Lear-Siegler ADM-3A de uso común durante la década de 1970, de donde se origina , entre otras cosas, la práctica de usar el ~carácter para representar el directorio de inicio , la /clave está al lado de la >clave:

distribución del teclado del terminal Lear-Siegler ADM-3A

En cuanto a por qué el directorio raíz se denota por un solo /, es una convención muy probablemente influenciada por el hecho de que el directorio raíz es el directorio de nivel superior de la jerarquía de directorios, y aunque otros directorios pueden estar debajo de él, generalmente no hay ' Es una razón para referirse a cualquier cosa fuera del directorio raíz. Del mismo modo, la entrada del directorio en sí no tiene nombre, porque es el límite del árbol del directorio visible.

Thomas Nyman
fuente
2
"Mientras que otros directorios pueden estar debajo de él, generalmente no hay una razón para referirse a nada fuera del directorio raíz". No entiendo esto No estoy seguro de a qué dirección te refieres con "debajo", pero no hay nada "fuera" en la jerarquía montada /. Los sistemas de archivos Unix son un solo árbol, con puntos de montaje para las distintas unidades.
alexis
44
También existe chrooty tal: no puede acceder a nada fuera de la nueva raíz, pero eso no significa que no estén allí.
Bobson
1
@Gilles, la ubicación física del disco no es la cuestión. Cualquier partición de disco está fuera de la partición raíz en ese sentido, pero está montada bajo raíz en la jerarquía del sistema de archivos. Bobson, buen punto sobre chroot, pero no encaja con lo que dijo Thomas: después de chroot no es que "generalmente no haya una razón" para salir de la raíz del sistema; es imposible. En Unix, todo en el sistema de archivos está bajo la raíz.
alexis
1
"Después de chroot no es que" generalmente no haya una razón "para salir de la raíz del sistema; es imposible". Esto es simplemente incorrecto. En el momento en que chroot()se introdujo, no tenía ninguna propiedad similar a la cárcel , simplemente afectaba la resolución del nombre de ruta. Incluso hoy, los procesos privilegiados pueden salir de un chroot por diseño . También lo mencioné chroot()en un comentario anterior .
Thomas Nyman
44
IIRC, la convención Multics no solo se utiliza >como separador de directorio, sino también <para referirse al directorio padre: <por sí solo era equivalente a .., mientras que <fooera equivalente a ../foo. Siempre me pareció estéticamente agradable.
Mark Reed
55

El primer sistema de archivos jerárquico como lo conocemos hoy fue diseñado para Multics . El diseño se describe en "Un sistema de archivos de uso general para almacenamiento secundario" por RC Daley y PG Neumann. Una característica destacada de este sistema de archivos es que un directorio es un archivo que puede estar contenido en un directorio como cualquier otro archivo. La estructura del archivo forma un árbol, en el que todos los nodos no hoja son directorios. La raíz del árbol es siempre un directorio. Cada archivo tiene un nombre (el nombre de la entrada ) que es único dentro de su directorio padre. El directorio raíz no tiene un nombre ya que no está contenido en otro directorio.

Para designar un archivo, debe describir la ruta desde la raíz del árbol. Multics adoptó una sintaxis natural para los nombres de ruta donde si Pes la ruta a un directorio y Fes el nombre de un archivo, entonces es la sintaxis para el archivo llamado dentro del directorio cuya ruta es .P>FFP

Para aquellos momentos en los que no desea cargarse con directorios, Multics tenía la noción de directorio de trabajo . Un nombre de archivo simple sin indicación de directorio se interpreta como un archivo en el directorio de trabajo.

Combinando estas reglas, fooes un archivo en el directorio de trabajo; foo>bares un archivo en el directorio secundario del directorio foode trabajo, y así sucesivamente. Estas reglas describen rutas relativas, pero se necesita una regla suplementaria para construir rutas absolutas a partir del directorio raíz. Dado que leer un nombre de ruta de izquierda a derecha corresponde a moverse de la raíz a las hojas del árbol, la raíz debe indicarse con un marcador especial a la izquierda del nombre de la ruta. Dado que los nombres de archivo nunca están vacíos (porque eso a menudo sería confuso), ningún nombre de ruta relativa comienza con el carácter >, lo que lo convierte en un marcador conveniente para nombres de ruta absolutos. Así >fooes el archivo llamado fooen el directorio raíz, >foo>bares el archivo llamado baren el directorio llamadofooen el directorio raíz, y así sucesivamente. Esto deja el directorio raíz, que podría ser la cadena vacía; sin embargo, a menudo no es conveniente usar la cadena vacía como un nombre de ruta, por lo que se escribe >, lo que tiene el beneficio adicional de que un nombre de ruta es absoluto si y solo si su primer carácter lo es >.

Unix adoptó este diseño de Multics. Como Unix ya había usado el carácter >para la redirección de salida en su shell de comandos, sus diseñadores eligieron un carácter diferente /para separar directorios en nombres de ruta.

Gilles
fuente
11

En los componentes de nombre de ruta en Unix, solo no se pueden usar dos caracteres: el carácter nulo, que termina las cadenas en C (el lenguaje del núcleo) y la barra diagonal, que está reservada como el separador de ruta. Además, los componentes de ruta no pueden ser cadenas vacías.

Entonces, en un nombre de ruta, solo tenemos dos tipos de tokens: una barra diagonal y un componente.

Supongamos que, sin agregar ningún token nuevo , nos gustaría admitir la compatibilidad con dos tipos de rutas, relativas y absolutas. Además, nos gustaría poder referirnos al directorio raíz, que no tiene nombre (no tiene padre que le dé un nombre).

¿Cómo podemos representar rutas relativas, rutas absolutas y referirnos al directorio raíz, usando solo la barra diagonal?

La forma más obvia de extender un lenguaje (que no sea la introducción de un nuevo token) es crear una nueva sintaxis: dar un nuevo significado a las combinaciones de tokens que son sintaxis no válida.

Las rutas que comienzan con una barra oblicua no tienen sentido, entonces, ¿por qué no utilizar una barra inclinada como marcador que indica "esta ruta es absoluta, en lugar de relativa"?

Una ruta que no contiene nada más que una barra también es inválida, entonces, ¿por qué no asignarle el significado "directorio raíz"?

Estos dos significados se unen porque una ruta absoluta comienza a buscar en el directorio raíz. En otras palabras, se puede considerar que una barra diagonal tiene el significado:

  • navegue al directorio raíz y consuma el carácter de barra diagonal.
  • si hay más material en la ruta, entonces trátelo como una ruta relativa, de lo contrario, habrá terminado.

Entonces, también podríamos incluir una barra diagonal final, lo que puede significar "esta ruta afirma que el último componente de la ruta es el nombre de un directorio en lugar de un archivo normal o cualquier otro tipo de objeto: esa barra diagonal indica ese directorio de manera similar a la forma en que la barra inclinada indica el directorio raíz ".

Con toda esta sintaxis anterior, todavía tenemos una sintaxis con un significado no asignado: barras dobles, barras triples, etc.

¿Por qué no simplemente presentar otro token y hacerlo de manera diferente? Esto probablemente se deba a que los diseñadores adoptaron enfoques minimalistas en general. (¿Por qué el ededitor solo muestra un mensaje ?cuando haces algo mal?) La barra diagonal es fácil de escribir y no requiere desplazamiento. Un lenguaje de ruta con solo dos tipos de token (componente y barra inclinada) es fácil de recordar y usar.

Otra consideración importante es que es posible manipular fácilmente las rutas utilizando solo representaciones de cadenas. Por ejemplo, podemos "volver a enraizar" las rutas absolutas a un nuevo directorio padre con bastante facilidad:

OLD_PATH=/old/path
NEW_HOME=/new/home

NEW_PATH="$NEW_HOME$OLD_PATH"  /new/home/old/path

Esto no funcionaría si indicáramos rutas absolutas de alguna otra manera, como un signo de dólar principal o cualquier otra cosa:

OLD_PATH=^old/path  # ^ means absolute path
NEW_HOME=^new/home

# now we need more string kung-fu than just catenation
NEW_PATH="$NEW_HOME/${OLD_PATH#^}"

Este tipo de codificación todavía es necesaria en algunos casos cuando se trata de rutas de estilo Unix, pero hay menos.

Kaz
fuente
8
"La barra es fácil de escribir, no requiere turno". Tal vez te bajes fácilmente al otro lado del estanque, pero aquí en Finlandia no solo tenemos que presionar shift, sino también llegar a la fila de números . ; P
Thomas Nyman
1
@ThomasNyman Sea como fuere, los diseños de teclado extranjeros probablemente no fueron una preocupación para Ken Thompson. La barra fue fácil de escribir para los desarrolladores de Unix y sus primeros usuarios.
Kaz
1
Lo suficientemente justo. Aunque bromeaba sobre todo, me parece interesante (y ocasionalmente divertido) cómo algunas peculiaridades del software con una larga herencia pueden explicarse por las peculiaridades del hardware contemporáneo .
Thomas Nyman
@ThomasNyman Jaja, me pregunto si el propio Bill Joy inicia sesión y actualiza las partes {cita-necesaria} en esa página ADM-3A, algún "Wikidickhead" luego responderá con: "este artículo contiene investigación original". :)
Kaz
@ThomasNyman, ahora creo que hay teclados de "pedal" en los que puede escribir /con el pie derecho. Como tocar un piano.
Pacerier