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 ed
editor 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.
cd /home
es equivalente acd /home/
agregar/
al final del nombre vacío proporciona acceso a ese directorio.