¿Qué directorio representa la ruta `//` en Linux?


13

Cuando quiero volver al directorio de nivel superior en Linux escribiendo cd .., escribí mal cd //. Para mi gran sorpresa, no se informan errores. Además, el aviso se convierte username@hostname://$. lsindica que ahora estoy en el directorio raíz.

¿Es esto un error o una característica del shell? Si es una característica, ¿es //un alias de /? Mi shell es GNU bash, versión 4.1.5 (1) -release (i686-linux-gnu).

Gracias y un saludo.


Respuestas:


30

Puede ser considerado cualquiera.

En Linux, //no significa nada: múltiples barras consecutivas se colapsan en una, en cualquier parte de la ruta, incluido el comienzo. Cambiar el directorio a lo //coloca /, como readlink /proc/self/cwdlo diría ejecutar ; Del mismo modo, /usr//local///binse contrae a /usr/local/bin.

Sin embargo, algunos otros sistemas similares a Unix, como Cygwin o el antiguo dominio / sistema operativo Apollo, utilizan el // prefijo para rutas de red como //fileserver/path/to/data. POSIX también permite esto.

Por varias razones, el shell bash rastrea el directorio actual por sí mismo (además del seguimiento proporcionado por el sistema operativo) y tiene un código que evita que la inicial //se colapse, para seguir siendo compatible con dichos sistemas. La "característica" es que bash proporciona un seguimiento más intuitivo del directorio actual, por ejemplo, cuando cdingresa en un enlace simbólico, bash le mostrará la ruta que espera, aunque el núcleo piense lo contrario. El "error" es que bash lo permite //incluso en sistemas que no lo usan.


Curiosamente, zshpermite cd //, pero es lo suficientemente inteligente como para mostrar /en la cadena de solicitud.
nuevo123456

@BinaryZebra Bitsavers tiene una colección de viejos manuales de Unix, incluidos los de Apollo; debería haber muchos ejemplos allí. El sitio web de TUHS también debería tener algo.
user1686

Muchas gracias, encontré la descripción de // en el manual de Bitsavers.

9

De la definición del nombre de ruta POSIX:

Un nombre de ruta puede contener opcionalmente una o más barras diagonales finales. Múltiples barras sucesivas se consideran iguales a una barra.

Fuente

Y más precisamente como la gravedad mencionada en su comentario a continuación, del capítulo 4.11 sobre Resolución de nombre de ruta:

Un nombre de ruta que comienza con dos barras sucesivas se puede interpretar de una manera definida por la implementación, aunque más de dos barras iniciales se tratarán como una sola barra.


1
Una sección más adecuada es 4.11 Resolución del nombre de ruta (último párrafo), ya que el comportamiento en cuestión sólo aparece con los dos principales barras.
user1686

3

Es una especie de característica. Si tiene un script de shell en uso y find, por ejemplo, todas las rutas tienen el prefijo ./ generalmente. Luego, si lo agrega a una ruta real, se convierte en `/my/path/./appended/path, que se resuelve en / my / path / appended / path. Entonces, si no me equivoco, // get se interpreta como /./ y, por lo tanto, /. Esto es lo mismo porque si fueras a / home / user //, terminarías en / home / user /


1

Yo iría por el mensaje que muestra "error".

Cualquiera de las rutas "/", "//", "//////////////////////", ... tienen el mismo significado: "/". Puede agregar tantos "/" donde quiera en una ruta de Unix, esto no cambia su significado.

El "error" está más relacionado aquí con el hecho de que su solicitud utiliza la última ruta de acceso escrita válida para mostrar, no el "pwd" real.

Divertido de todos modos;)


De acuerdo: //en el indicador es un efecto secundario de la variable de entorno del indicador ( $PS1): ¿cómo se PS1define?
Doug Harris

@DougHarris la $PS1variable se define como [\u@\h \W]\$. ¿Algún problema con la configuración?
Summer_More_More_Tea

Impar. Si pruebo esa PS1, solo obtengo una /cuando pwd = /. Me preguntaba si estabas haciendo algún trabajo extra para obtener el directorio. Se $PROMPT_COMMANDestablece?
Doug Harris

@DougHarris Sí, esta variable está establecida, cuyo valor es echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007". ¿Podría explicar por favor con un poco de detalle? No estoy muy familiarizado con estas dos variables. Gracias.
Summer_More_More_Tea

Lea la página de manual de bash y la búsqueda de PS1y PROMPT_COMMAND- el uso man bashen su línea de comandos o leer en línea
Doug Harris

1

Es una característica y todos los // múltiples serán reemplazados por un solo /

Es útil si tiene variables con rutas como el ejemplo al final. Por lo tanto, su CD no recibirá ningún error y no tendrá que cambiar la variable del espacio de trabajo.

MY_WORKSPACE = / home / your_username / workspace /
MY_NEW_PROJECT = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PROJECT 

el contenido completo de la variable del proyecto es

/ home / your_username / workspace // my_proj /

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.