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 ~/Documents
es 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 $HOME
variable o en la ruta del directorio de inicio del usuario actual (cf. man bash
), por lo que la ruta real /home/myuser/Documents
es, 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/../lib
que 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 $HOME
no 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?
/
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.~/foo
un camino relativo. Lo que está llegando es la diferencia entre codificación rígida y parametrización. Vea mi respuesta para más detalles.~/Documents
y$HOME/Documents
no 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.Respuestas:
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.2
vs.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.ejDebian 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 sinchroot(8)
entrar en él.Cada proceso de Unix tiene su propio cwd. El
pwd
comando 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/foo
y/home/peter/bin/foo
es 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
,~/foo
se expandiría a una ruta relativa. Esta no sería una configuración utilizable en absoluto.fuente
/opt/kde3/bin/../lib
por 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 :)!realpath(1)
) hacen ambas cosas: canonicalizar y hacer absoluto (así como seguir enlaces simbólicos), por lo que posiblemente haya cierta confusión.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,~/Documents
es aproximadamente lo mismo que$HOME/Documents
(de nuevo, la sintaxis de shell). Como$HOME
debería ser una ruta absoluta, el valor de$HOME/Documents
también es una ruta absoluta. Pero el texto$HOME/Documents
o~/Documents
tiene 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
~/Documents
es un fragmento de shell-script que se expande a un camino absoluto.fuente
$HOME
significa, 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.odt
en LibreOffice, pero no$HOME/somefile.odt
, incluso si LibreOffice se inició desde un shell en el que $ HOME está configurado correctamente.~
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.glob
ywordexp
hacer tilde expansión entre otras cosas.~
expansión; la mayoría no. Por ejemplo, si escribels -l ~
, ells
programa nunca ve el~
personaje; es expandido por el shell antes dels
ser invocado. Si realmente pasa un~
als
, no lo tratará especialmente; tryls -l '~
'' (que intentará enumerar un archivo llamado literalmente~
).Si su
$HOME
es/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../Documents
ofoo/bar
Algunas conchas viejas no se expanden
~
(el caminobash
,tcsh
,zsh
, etc ... hacer); verían~/Documents
como un camino relativo que comienza con~
; pero generalmente no tiene un nombre de directorio como~
(pero puede crear uno conmkdir '~'
, lo que no recomiendo).fuente
~
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,~/Documents
es el directorioDocuments
en el inicio del usuario actual, independientemente de cuál sea el directorio actual. Entonces es un camino absoluto.fuente
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.
fuente
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.
fuente
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$HOME
como tipos similares de tokens. Ambos deben ser sustituidos, por un componente de ruta, antes de que la ruta se resuelva en una ruta absoluta.fuente
..
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.