Pregunta:
Estoy trabajando en una secuencia de comandos de Python que pasa las ubicaciones de los archivos a un subproceso de scp. Todo está bien, pero estoy en una situación en la que puedo terminar concatenando una ruta con un nombre de archivo tal que haya un doble ' /
en la ruta. Sé que a bash no le importa si tiene varios separadores de archivos, pero me pregunto cómo se rectifica exactamente. ¿Es bash lo que quita extra /
s o realmente no importa nunca?
Lo pregunto porque me ahorrará varias líneas de código para verificar si hay extra /
s 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 significativo el uso de múltiples /
s en una ruta
Respuesta:
Se permiten varias barras y equivalen a una sola barra. De la especificación Single Unix (versión 4) , definiciones base §3.271 ruta de acceso : "Varias barras sucesivas se consideran iguales a una barra".
Hay una excepción: si un nombre de ruta comienza con dos caracteres de barra diagonal sucesivos, el primer componente que sigue a los caracteres de barra inicial puede interpretarse de una manera definida por la implementación. (ref: definiciones base §4.13 resolución de nombre de ruta ). Linux en sí no hace esto, aunque algunas aplicaciones sí lo hacen, y otros sistemas Unix-ish sí lo hacen (por ejemplo, Cygwin).
Un /
al final de un nombre de ruta obliga al nombre de ruta a hacer referencia a un directorio. En ( POSIX 1003.1-2001 (Single Unix v4) definiciones base §4.11 resolución de nombre de ruta , una /
final es equivalente a una /.
final /.
Definiciones base POSIX 1003.1-2008 (Single Unix v4) §4.13 elimina el requisito de hacerlo equivalente a /.
, con el fin de hacer frente a directorios no existentes (por ejemplo, se requiere mkdir foo/
para funcionar, mientras que mkdir foo/.
no lo haría – ver la justificación del cambio).
Para los programas que actúan sobre una entrada de directorio, si foo
es un enlace simbólico a un directorio, pasar foo/
es una forma de hacer que el programa actúe sobre el directorio en lugar del enlace simbólico.
¹ Tenga en cuenta que esto se aplica únicamente a la resolución de nombres de ruta, es decir, al acceder a archivos. Las manipulaciones de nombre de archivo pueden funcionar de manera diferente. Por ejemplo, el basename
y el basename
dirname
ignoran las barras inclinadas.