Estoy escribiendo una biblioteca para manipular cadenas de ruta Unix. Siendo ese el caso, necesito entender algunos rincones oscuros de la sintaxis de los que la mayoría de la gente no se preocuparía.
Por ejemplo, lo mejor que puedo decir, parece que foo/bar
y foo//bar
ambos apuntan al mismo lugar.
Además, ~
generalmente representa el directorio de inicio del usuario, pero ¿qué pasa si aparece en el medio de una ruta? ¿Qué pasa entonces?
Estas y varias docenas de otras preguntas oscuras necesitan respuesta si voy a escribir código que maneje todos los casos posibles correctamente. ¿Alguien sabe de una referencia definitiva que explique las reglas de sintaxis exactas para estas cosas?
(Desafortunadamente, la búsqueda de términos como "sintaxis de ruta de Unix" solo muestra un millón de páginas que discuten la $PATH
variable ... ¡Diablos, incluso estoy luchando por encontrar etiquetas adecuadas para esta pregunta!)
~
) se trata en Cómo Linux maneja los separadores de múltiples rutas (/ home //// nombre de usuario /// archivo) . Lo más parecido a una referencia normativa sería la especificación POSIX o Single Unix , no es una lectura fácil.Respuestas:
Hay tres tipos de caminos:
foo
,foo/bar
,../a
,.
. No comienzan con/
y son relativos al directorio actual del proceso que realiza una llamada al sistema con esa ruta./
,/foo/bar
o///x
. Comienzan con 1, o 3 o más/
, no son relativos, se buscan a partir del/
directorio raíz.//foo
ser tratado especialmente, pero no especifica cómo. Algunos sistemas lo usan para casos especiales como archivos de red . Tiene que ser exactamente 2 barras.Aparte de al principio, las secuencias de barras actúan como una.
~
solo es especial para el shell , está expandido por el shell, no es especial para el sistema en absoluto. Cómo se expande depende de la cáscara. Los proyectiles realizan otras formas de expansión como globbing (*.txt
) o expansión variable/$foo/$bar
u otras. En lo que respecta al sistema,~foo
es solo una ruta relativa como_foo
ofoo
.Cosas a tener en cuenta:
foo/
No es lo mismo quefoo
. Está más cerca defoo/.
quefoo
(especialmente sifoo
es un enlace simbólico) para la mayoría de las llamadas al sistema en la mayoría de los sistemas (foo//
es lo mismo quefoo/
aunque).a/b/../c
no es necesariamente lo mismo quea/c
(por ejemplo, sia/b
es un enlace simbólico). Lo mejor es no tratarlo..
especialmente.a/././././b
lo mismo comoa/b
si fuera.fuente
/
,.
y..
(?)//foo
manejo se encuentra en Cygwin, donde se usa para rutas UNC . Es decir,//server/share/dir/file.txt
es una ruta legal que señala fuera del sistema por defecto. Cygwin recurre a mirar el sistema local si no puede encontrarloserver
.Si. Esto es común porque el software a veces concatena una ruta suponiendo que la primera parte no se terminó con una barra diagonal, por lo que se lanza uno para asegurarse (lo que significa que puede terminar siendo dos o más).
foo///bar
yfoo/////bar
también apuntan al mismo lugar quefoo/bar
. Una buena función para una biblioteca de manipulación de rutas sería una que reduzca cualquier número de barras secuenciales a una (excepto al comienzo de una ruta, donde puede usarse de una manera URL-ish, o, como señala Stephane, para cualquier propósito especial no especificado).Esa transformación se realiza a través de la exapansión de shell y tilde , que solo funciona si es el primer personaje en el camino. Si necesita o no lidiar con esto depende del contexto. Si la biblioteca se va a usar con programas normales que reciben, por ejemplo, argumentos de la línea de comandos que contienen una ruta, la expansión de tilde ya está hecha cuando ven la ruta. La única situación que puedo ver que es preocupante es si está procesando rutas directamente desde un archivo de texto.
Más allá de eso,
~
es un carácter legal en una ruta * nix y no debe cambiarse a otra cosa. Según esto , los únicos caracteres que no son legales en un nombre de archivo Unix son/
(porque es el separador de ruta) y "nulo" (también conocido como un byte cero) porque generalmente son ilegales en el texto.fuente
//
lo que técnicamente tampoco es eso. Tanto URLS como la nueva especificación POSIX libremente ambigua de SC//
pueden haberse derivado de la misma, en cuyo caso "URL-ish" parece una etiqueta adecuada para la convención (incluso si los UNC son más antiguos, e incluso si la apariencia no es intencional) Nunca diría que "son URLS", solo eso//
o\\
sirve para un propósito "URL-ish".