¿Es `~ / Documents` una ruta relativa o absoluta?

37

Esto es simplemente una pregunta de vocabulario, pero que sigue dando vueltas en mi cabeza.

Proviene de un examen de práctica de un libro de preparación de LPIC . La respuesta correcta según el libro es que ~/Documentses un directorio relativo porque es relativo al directorio de inicio.

Sin embargo, este libro contiene una proporción honorable de errores tipográficos y errores, por lo que no puedo dar por sentado todo lo que está escrito allí. Aquí no estoy de acuerdo porque para mí ~actúa como una variable expandida por el shell en el contenido de la $HOMEvariable o en la ruta del directorio de inicio del usuario actual (cf. man bash), por lo que la ruta real /home/myuser/Documentses, de hecho, un directorio absoluto.

Incluso Wikipedia , por una vez, no me parece de ninguna ayuda sobre este tema (incluso si parece confirmar que el libro está equivocado sobre este tema):

Una ruta absoluta o completa apunta a la misma ubicación en un sistema de archivos, independientemente del directorio de trabajo actual. Para hacer eso, debe contener el directorio raíz.

Por el contrario, una ruta relativa comienza desde un directorio de trabajo dado, evitando la necesidad de proporcionar la ruta absoluta completa.

Una vez más, no estoy de acuerdo: de acuerdo con esta definición, la ruta /opt/kde3/bin/../libque no depende del directorio de trabajo actual debería ser absoluta, sin embargo, mi comprensión actual de esto coincide con el autor del libro haciendo que esta ruta sea relativa.

Una búsqueda rápida en la web solo está agregando a mi frustración, según el Diccionario Webster :

ruta absoluta : una ruta relativa al directorio raíz. Su primer carácter debe ser el separador de nombre de ruta.

Entonces $HOME/Documents, ¿ o incluso $HOMEno se considerarían directorios absolutos? ¿O esta definición implica expansión variable? ¿Qué pasa con el ~personaje de la concha ? ¿Hay alguna definición confiable de directorio relativo versus absoluto que pueda encontrar en algún lugar y me equivoco completamente?

WhiteWinterWolf
fuente
77
Todas las rutas son relativas, algunas de ellas son solo relativas al directorio raíz /y las que llamamos absolutas. Por tanto, todo lo que se inicia desde /que yo llamaría absoluta (aunque esto es /usr/../etc) y todo lo demás que llamarían relativa ( ~/Doc, Doc, ../john/Doc, $HOME/..., ...). El punto es que absoluto debería funcionar independientemente del directorio de trabajo actual o del usuario actual. El pariente solo puede funcionar en algunos casos específicos.
jimmij
66
La ruta podría expandirse a una ubicación diferente dependiendo de quién sea el usuario. Dicho esto, en mi opinión, este sigue siendo un camino absoluto, no un camino relativo. Aunque no creo que las definiciones de ruta absoluta y relativa estén definidas con tanta precisión. Esto no es matemática. Esta pregunta realmente no prueba la comprensión, en realidad, y no tiene sentido.
Faheem Mitha
1
@FaheemMitha: LPIC es una certificación de distribución neutral de Linux. La certificación en sí parece estar bien, pero está lejos de ser el caso de (al menos algunos) libros vendidos para prepararse para este examen como autoestudio ...
WhiteWinterWolf
2
@jimmij: "relativo" tiene un significado técnico específico en el contexto de los caminos, y usar un sentido diferente de la palabra en inglés es una mala práctica. Estoy totalmente en desacuerdo con llamar a ~/fooun camino relativo. Lo que está llegando es la diferencia entre codificación rígida y parametrización. Vea mi respuesta para más detalles.
Peter Cordes
1
Las definiciones del diccionario Webster son correctas, pero muy confusas. Sin embargo, implica que cadenas como ~/Documentsy $HOME/Documentsno son caminos. Identifican rutas (absolutas) después de la expansión, pero no son rutas en sí mismas. Creo que eso está de acuerdo con la cantidad de usuarios de Unix / Linux que usan el término, pero sin duda esas cadenas también se denominan rutas.
reinierpost

Respuestas:

41

Si el autor intentaba atraparte hablando de esa cadena literal (sin expansión de shell) como una ruta, entonces es una ruta relativa ( mkdir -p './~/Documents'). De otra manera:


Se trata de un ruta absoluta , porque resolverla no depende del directorio de trabajo actual del proceso. La ruta relativa siempre significa relativa al directorio de trabajo del proceso. O en el caso de los objetivos de enlace simbólico, en relación con la ubicación del enlace simbólico. ( gcc -> gcc-5.2vs. gcc -> /usr/bin/gcc-5.2) Esto es importante para los montajes NFS y otros casos en los que puede obtener el mismo enlace simbólico a través de diferentes rutas absolutas. p.ej

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

Debian a veces instala enlaces simbólicos ../../doc/whatever/whatever, en lugar de un objetivo de enlace simbólico absoluto, por lo que funciona cuando NFS se monta en otro lugar, o cuando mira un chroot sin chroot(8)entrar en él.

Cada proceso de Unix tiene su propio cwd. El pwdcomando existe solo para imprimirlo.

consulte: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html para obtener más información sobre cómo cambiar directorios con llamadas al sistema POSIX.


Como todos han dicho, ~el shell lo expande antes de que la ruta se use para algo. Utilizando~/bin/myprog en un script de shell hará que funcione de manera diferente para diferentes usuarios. La diferencia entre ~/bin/fooy /home/peter/bin/fooes que uno de ellos ha codificado la ubicación, mientras que el otro lo ha parametrizado. Es un error (IMO) llamar a la ~versión una ruta relativa.

Hablar de que las cosas son "relativas a una variable de entorno" es confuso. Es una mala práctica usar diferentes significados en inglés de términos que tienen significados técnicos específicos en el contexto en el que los está utilizando.

En un sistema roto, con HOME=a/relative/path, ~/foose expandiría a una ruta relativa. Esta no sería una configuración utilizable en absoluto.

Peter Cordes
fuente
3
Gracias por esta respuesta, parece ser la más completa para mí. También tengo la impresión de que el autor mezcló erróneamente la noción de camino canónico en esto (que el autor no menciona en ninguna parte). /opt/kde3/bin/../libpor ejemplo, se clasifica erróneamente como una ruta relativa: es una ruta absoluta pero no es la canónica. Como dijiste, esto hace que todo sea confuso, ¡así que gracias por tu aclaración y la información relacionada con NFS :)!
WhiteWinterWolf
1
Tengo que concluir que escribir un libro de preparación de exámenes no es muy divertido, y que las personas que solo usan Unix o GNU / Linux para su computación cotidiana no son quienes escriben esos libros. Ese ejemplo de llamar a un pariente de camino no canónico me parece realmente malo y obvio. man7.org/linux/man-pages/man3/realpath.3.html (y realpath(1)) hacen ambas cosas: canonicalizar y hacer absoluto (así como seguir enlaces simbólicos), por lo que posiblemente haya cierta confusión.
Peter Cordes
2
Aún así, esos son solo conceptos cotidianos para mí. Creo que sería extraño tener un trozo de papel que dijera que los conocía ... Pero buena suerte con tu trozo de papel, @WhiteWinterWolf, para mostrar a todas las personas que les gusta mirar trozos de papel. :)
Peter Cordes
48

Esta es esencialmente una pregunta sobre la definición de términos. Entonces, para sus propósitos, la respuesta es lo que LPIC quiera. Pero podemos llegar a algunas conclusiones basadas en hechos técnicos:

Si pasó '~/Documents'a una llamada del sistema , buscaría un directorio llamado exactamente ~en el directorio actual (y probablemente fallará). Entonces, por la noción de nombres de ruta utilizados por el núcleo , esta es una ruta relativa, pero eso no es lo que queríamos decir.

~es una sintaxis implementada por el shell (y otros programas que la imitan por conveniencia) que la expande en un nombre de ruta real. Para ilustrar, ~/Documentses aproximadamente lo mismo que $HOME/Documents(de nuevo, la sintaxis de shell). Como $HOMEdebería ser una ruta absoluta, el valor de $HOME/Documents también es una ruta absoluta. Pero el texto $HOME/Documentso ~/Documentstiene que ser expandido por el shell para convertirse en el camino que queremos decir.

Por lo tanto, si quisiera ser preciso y consistente, diría que ~/Documentses un fragmento de shell-script que se expande a un camino absoluto.

Kevin Reid
fuente
Por supuesto, el núcleo no tendría idea de lo que $HOMEsignifica, al igual que no tiene idea de lo que ~significa. Sin embargo, considero que la afirmación de que la expansión es realizada por el shell es dudosa; la mayoría de las aplicaciones admiten esto, que apunta hacia la biblioteca C en lugar del shell. Sin embargo, la expansión de la variable de entorno es una característica del shell; puede abrir ~/somefile.odten LibreOffice, pero no $HOME/somefile.odt, incluso si LibreOffice se inició desde un shell en el que $ HOME está configurado correctamente.
un CVn
55
Puede encontrarlo dudoso todo lo que desee, pero está documentado y debe ser fácil de confirmar o refutar en C.
Inútil el
66
Otros programas implementan la ~sintaxis en imitación del shell, porque es un atajo útil. En realidad, no sé si hay una función de biblioteca que hace la expansión, pero definitivamente es algo que se hace por separado de usar el nombre de ruta.
Kevin Reid
2
globy wordexphacer tilde expansión entre otras cosas.
o11c
2
@ MichaelKjörling: algunos programas implementan la ~expansión; la mayoría no. Por ejemplo, si escribe ls -l ~, el lsprograma nunca ve el ~personaje; es expandido por el shell antes de lsser invocado. Si realmente pasa un ~a ls, no lo tratará especialmente; try ls -l '~'' (que intentará enumerar un archivo llamado literalmente ~).
Keith Thompson, el
16

Si su $HOMEes /home/white/, ~/Documents(igual que $HOME/Documents) se expande por el shell (consulte aquí para obtener una explicación) a /home/white/Documents, que es un absoluto ruta .

Una ruta relativa es aquella que no comienza con un /(después de la expansión del shell), como ../Documentsofoo/bar

Algunas conchas viejas no se expanden ~(el camino bash, tcsh, zsh, etc ... hacer); verían ~/Documentscomo un camino relativo que comienza con ~; pero generalmente no tiene un nombre de directorio como ~(pero puede crear uno con mkdir '~', lo que no recomiendo).

Basile Starynkevitch
fuente
deberías mencionar qué proyectiles no se expanden~
Edward Torvalds
3

Una ruta absoluta comienza en /(lo que hace referencia es fijo), una ruta relativa comienza en el directorio actual (y, por lo tanto, lo que hace referencia cambia a medida que cambia el directorio actual). La mayoría de los shells se usan ~al principio como una abreviatura de la ruta absoluta al directorio de inicio del usuario actual, es decir, ~/Documentses el directorio Documentsen el inicio del usuario actual, independientemente de cuál sea el directorio actual. Entonces es un camino absoluto.

vonbrand
fuente
1

La ruta podría expandirse a una ubicación diferente dependiendo de quién sea el usuario. Dicho esto, en mi opinión, este sigue siendo un camino absoluto, no un camino relativo. Sin embargo, no creo que las definiciones de ruta absoluta y relativa estén definidas con tanta precisión. Esto no es matemática. Esta pregunta realmente no prueba la comprensión, en mi opinión, y no tiene sentido.

Faheem Mitha
fuente
La definición es mucho más que una opinión. Wikipedia lo apuñala para el caso general, no solo para Unix: en.wikipedia.org/wiki/…
Peter Cordes
1

El uso de ~ / al principio hace que la ruta sea absoluta ya que (por cualquier definición) poder encontrar documentos no depende de dónde se encuentre actualmente. Sin embargo, la expansión la realiza el shell, no el kernel, por lo que si está utilizando un shell que no reconoce esta sintaxis (como / bin / sh, el shell Bourne original, no el alias bash), se quedará sin suerte.

Curiosamente, si usa ~ root / en lugar de ~ /, la optimización de la lectura de $ HOME generalmente no se aplica y siempre se resolverá a un absoluto si / etc / passwd es correcto.

jrrk
fuente
-1

El libro parece estar asumiendo que un camino absoluto es cualquier camino que comienza con un / , y un camino relativo es cualquier otra cosa.

Puede ver ..y $HOMEcomo tipos similares de tokens. Ambos deben ser sustituidos, por un componente de ruta, antes de que la ruta se resuelva en una ruta absoluta.

jl6
fuente
3
¿Cómo es ..algo así $HOME? ..puede estar al comienzo de una ruta pasada directamente a una llamada del sistema, no se requiere expansión de shell. Tal camino no es un camino absoluto; sigue siendo relativo a la ubicación del proceso cwd o enlace simbólico. A menos que el autor intentara atraparte hablando de esa cadena literal (sin expansión de shell) como una ruta. Creo que estás tratando de poner excusas para el libro, pero estoy más inclinado a decir que está mal y no dejar que las cosas se confundan.
Peter Cordes