¿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.

Summer_More_More_Tea
fuente
Ver superuser.com/q/314102/91047
Stéphane Giménez

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.

usuario1686
fuente
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.

Shadok
fuente
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 /

Chuck R
fuente
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;)

Ouki
fuente
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 /

phschoen
fuente