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
join
yabspath
y 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
foo
es 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,
basename
edirname
ignore 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 probarfalse
que son absolutos, conforme a la especificación Unix / POSIX.Úselo
os.path.join
en 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
$NORMALIZED
Sin 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