Estoy trabajando en un script de Python que pasa las ubicaciones de los archivos a un subproceso scp. Todo está bien, pero estoy en una situación en la que puedo terminar concatenando una ruta con un nombre de archivo de modo que haya un doble ' /en la ruta. 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 te quita más /o realmente no importa nunca?
Pregunto porque me ahorrará varias líneas de código para verificar si hay /s adicionales mientras 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 una ruta

joinyabspathy tales órdenes.Respuestas:
Se permiten múltiples barras y son equivalentes a una sola barra. De la especificación Single Unix (versión 3) , definiciones básicas §3.266 nombre de ruta : "Varias barras sucesivas se consideran lo mismo que una barra".
Hay una excepción: si un nombre de ruta comienza con exactamente dos barras, puede tratarse de manera diferente (ref: definiciones básicas §4.11 resolución de 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 las definiciones de base ( POSIX 1003.1-2001 (Single Unix v3) §4.11 resolución de nombre de ruta , un final/es equivalente a un final/.. POSIX 1003.1-2008 (Single Unix v4) definiciones de base §4.12 elimina el requisito de hacerlo equivalente a/., en orden para hacer frente a directorios no existentes (p. ej.,mkdir foo/se requiere que funcione, mientrasmkdir foo/.que no lo haría; consulte la justificación del cambio).Para los programas que actúan en una entrada de directorio, si
fooes un enlace simbólico a un directorio, entonces pasarfoo/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,
basenameedirnameignore las barras diagonales finales.fuente
/.ha sido eliminado después de un proceso de discusión posterior, ya que era ambiguo. De todos modos, +1 ya que encontrar este tipo de información bien resumida es difícil.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 de 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
fuente
En todos los sistemas Unix que he visto, es lo mismo que un solo
/, pero el estándar Unix especifica quepor lo que puede manejarse especialmente, dependiendo de su sistema. (Algunas versiones anteriores de Unix usaban un doble encabezado
/para el acceso remoto al sistema de archivos, y aún puede haber algunas que lo hagan).fuente
//remote/...en acceso remoto al sistema de archivos, probablemente por coherencia con Windows '\\remote\....//remote/...lo mismo que el\\remote\...formato de ruta UNC .//de una manera especial, ya que pueden probarfalseque son absolutos, conforme a la especificación Unix / POSIX.Úselo
os.path.joinen Python y no obtendrá múltiples barras. Construir nombres de archivo usted mismo concatenando cadenas se considera un estilo pobre de Python.fuente
/muy bien.No hay diferencia.
Se ignoran varias barras (sin efecto), por ejemplo:
fuente
Por supuesto, puede normalizar una ruta con posibles múltiples / (barras) en ella al pasarla
tr -s... y luego usar
$NORMALIZEDSin embargo, debería ser necesario. En cuanto a lo que sé, cualquier núcleo de UNIX correctamente debe ignorar los separadores de ruta concurrentes --- o conceptualmente tratarlos como ...
/./...fuente