GNU/Linux >> Tutoriales Linux >  >> Linux

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

La barra diagonal / es el carácter delimitador que separa directorios en rutas en sistemas operativos similares a 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, usaba el > carácter 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 la 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, entre otras cosas, la práctica de usar el ~ carácter para representar el origen del directorio de inicio, el / la tecla está al lado de > clave:

En cuanto a por qué el directorio raíz se denota con un solo / , es una convención 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 razón para hacer referencia a nada fuera del directorio raíz. . De manera similar, la entrada del directorio en sí no tiene nombre, porque es el límite del árbol de directorios visible.


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 propósito general para almacenamiento secundario" por R.C. Daley y P. G. 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 de archivos forma un árbol, en el que todos los nodos que no son hojas 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 principal. El directorio raíz no tiene 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 P es la ruta a un directorio y F es el nombre de un archivo, entonces P>F es la sintaxis del archivo llamado F dentro del directorio cuya ruta es P .

Para esos momentos en los que no quiere cargar con directorios, Multics tenía una 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, foo es un archivo en el directorio de trabajo; foo>bar es un archivo en el directorio secundario foo del directorio de trabajo, y así sucesivamente. Estas reglas describen rutas relativas, pero se necesita una regla complementaria para crear rutas absolutas a partir del directorio raíz. Dado que leer el nombre de una 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 nunca con el carácter > , lo que lo convierte en un marcador conveniente para nombres de ruta absolutos. Así >foo es el archivo llamado foo en el directorio raíz, >foo>bar es el archivo llamado bar en el directorio llamado foo en 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 nombre de ruta, por lo que en su lugar se escribe > , que tiene el beneficio adicional de que un nombre de ruta es absoluto si y solo si su primer carácter es > .

Unix adoptó este diseño de Multics. Dado que 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 rutas.


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 idioma del núcleo) y la barra inclinada, que se reserva como separador de ruta. Además, los componentes de la ruta no pueden ser cadenas vacías.

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

Supongamos que, sin agregar nuevos tokens , nos gustaría admitir dos tipos de rutas, relativas y absolutas. Además, nos gustaría poder hacer referencia 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 oblicua?

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

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

Una ruta que no contiene nada más que una barra inclinada tampoco es válida, así que ¿por qué no asignarle el significado de "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 inicial tiene el significado:

  • navegue hasta el directorio raíz y consuma el carácter de barra inclinada.
  • si hay más material en la ruta, procéselo como una ruta relativa; de lo contrario, habrá terminado.

Entonces, también podríamos agregar una barra inclinada final, 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 inclinada final denota ese directorio de manera similar a la forma en que la barra diagonal inicial denota el directorio raíz".

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

¿Por qué no simplemente introducir otro token y hacerlo de manera diferente? Esto probablemente se deba a que los diseñadores adoptaron enfoques minimalistas en general. (¿Por qué el ed editor solo muestra un ? cuando haces algo mal?) La barra inclinada es fácil de escribir, no requiere cambio. Un lenguaje de ruta con solo dos tipos de token (componente y barra) 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 rootear" las rutas absolutas a un nuevo directorio principal 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 forma, como un signo de dólar inicial 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 se necesita en algunos casos cuando se trata de rutas de estilo Unix, pero hay menos.


Linux
  1. Cómo encontrar el archivo más antiguo en un árbol de directorios en Linux

  2. ¿Por qué se eligió '~' para representar el directorio de inicio?

  3. Linux:¿la barra inclinada (/) forma parte del nombre del directorio raíz de Linux?

  4. cómo encontrar el propietario de un archivo o directorio en python

  5. ¿Cómo obtengo el directorio absoluto de un archivo en bash?

Comprender el directorio /etc/sysconfig

Comprender el directorio /etc/skel en Linux

¿Núcleo volcado, pero el archivo principal no está en el directorio actual?

¿Cómo cambio el directorio raíz de un servidor Apache?

¿Por qué se permite incluso el terrible 'rm -rf /'?

¿Por qué no puedo eliminar este archivo como root?