it-swarm-es.tech

¿Cómo maneja Linux múltiples separadores de ruta consecutivos (/ home //// nombre de usuario /// archivo)?

Estoy trabajando en un script python que pasa las ubicaciones de los archivos a un subproceso scp. Eso está bien, pero estoy en una situación en la que puedo terminar concatenando una ruta con un nombre de archivo tal que hay un doble '/ en el camino. Sé que a bash no le importa si tienes varios separadores de archivos, pero me pregunto cómo se rectifica exactamente eso. ¿Es bash lo que tiras extra /s o realmente no importa nunca?

Pregunto porque me ahorrará varias líneas de código para verificar si hay más /s mientras se concatena. Sé que no es gran cosa, pero también tengo curiosidad. Tengo un script bash que tiene la línea cd //usr (en lugar de cd /usr), lo que parece implicar que podría ser importante usar múltiples /s en un camino

117
Falmarri

Se permiten múltiples barras y son equivalentes a una sola barra. Del especificación Single Unix (versión 4) , definiciones básicas §3.271 nombre de ruta : "Múltiples barras sucesivas se consideran lo mismo que una barra".

Hay una excepción: si un nombre de ruta comienza con dos caracteres sucesivos, el primer componente que sigue a los caracteres iniciales se puede interpretar de una manera definida por la implementación. (ref: definiciones básicas §4.13 resolución del nombre de ruta ). Linux en sí mismo no hace esto, aunque algunas aplicaciones podrían hacerlo, y otros sistemas unix-ish sí (por ejemplo, Cygwin).

Un final / al final de un nombre de ruta obliga al nombre de ruta a referirse a un directorio. En ( POSIX 1003.1-2001 (Single Unix v4) definiciones base §4.11 resolución de nombre de ruta , un final / es equivalente a un final /.. POSIX 1003.1-2008 (Single Unix v4) definiciones base §4.1 elimina el requisito de hacerlo equivalente a /., para hacer frente a directorios no existentes (por ejemplo, mkdir foo/ se requiere para trabajar, mientras que mkdir foo/. would - ver justificación para el cambio).

Para los programas que actúan en una entrada de directorio, si foo es un enlace simbólico a un directorio, entonces pasa foo/ es una forma de hacer que el programa actúe en el directorio en lugar del enlace simbólico.

¹ Tenga en cuenta que esto solo se aplica a la resolución del nombre de ruta, es decir, al acceder a los archivos. Las manipulaciones de nombre de archivo pueden funcionar de manera diferente. Por ejemplo basename y dirname ignoran las barras diagonales finales.

El sistema operativo tampoco parece importarle, ya que acaba de probar un programa en C con una syscall directa para abrir con un // en la ruta.

Sin embargo, puede usar la función de biblioteca python os.path.normpath para normalizarlo, lo que le ahorra tener que escanear a través de la cadena en busca de extras. Otros idiomas tienen funciones similares.

http://docs.python.org/library/os.path.html#os.path.normpath

17
Ivatar

En todos los sistemas Unix que he visto, es lo mismo que un solo /, pero estándar de Unix especifica que

Un nombre de ruta que comience con dos barras sucesivas puede interpretarse de una manera definida por la implementación, aunque más de dos barras diagonales principales se tratarán como una sola barra diagonal.

por lo que puede manejarse especialmente, dependiendo de su sistema. (Algunas versiones anteriores de Unix usaban un doble líder / para acceso remoto al sistema de archivos, y aún puede haber algunos que lo hagan).

9
Fred Foo

Utilizar os.path.join in Python y no obtendrás múltiples barras. La construcción de nombres de archivo tú mismo concatenando cadenas se considera pobre Python estilo.

7
Neil Mayhew

No hay diferencia.

Se ignoran varias barras (sin efecto), por ejemplo:

ls -al //usr///////bin/sed
3
ChristopheD

Por supuesto, puede normalizar una ruta con posibles múltiples/(barras) en ella pasándola a través de tr -s

NORMALIZED=$(echo "$UNHYGIENIC" | tr -s / /)

... y luego usa $NORMALIZED

Sin embargo, debería ser necesario. En cuanto a lo que sé, cualquier núcleo de UNIX debería ignorar los separadores de ruta concurrentes --- o conceptualmente tratarlos como ..././...

0
Jim Dennis