Je travaille sur un script python qui transmet les emplacements de fichiers à un sous-processus scp. Tout va bien, mais je suis dans une situation où je peux finir par concaténer un chemin avec un nom de fichier tel qu'il y a un double '/
Sur le chemin. Je sais que bash ne se soucie pas si vous avez plusieurs séparateurs de fichiers, mais je me demande exactement comment cela est rectifié. Est-ce bash qui supprime le /
supplémentaire s ou est-ce que ça n'a vraiment jamais d'importance ?
Je demande car cela me fera économiser plusieurs lignes de code pour vérifier les /
supplémentaires s lors de la concaténation. Je sais que ce n'est pas grave, mais je suis aussi curieux. J'ai un script bash qui a la ligne cd //usr
(au lieu de cd /usr
), ce qui semble impliquer qu'il pourrait y avoir une signification à l'utilisation de plusieurs /
s dans un chemin
Réponse acceptée :
Plusieurs barres obliques sont autorisées et sont équivalentes à une seule barre oblique. À partir de la spécification Single Unix (version 4), définitions de base §3.271 nom de chemin :"Plusieurs barres obliques successives sont considérées comme identiques à une seule barre oblique."
Il y a une exception :si un nom de chemin commence par deux barres obliques successives, le premier composant suivant les barres obliques de début peut être interprété d'une manière définie par l'implémentation. (réf :définitions de base §4.13 résolution des noms de chemin). Linux lui-même ne le fait pas, bien que certaines applications puissent le faire, et d'autres systèmes unix-ish le font (par exemple, Cygwin).
Un /
à la fin à la fin d'un chemin force le chemin à se référer à un répertoire. Dans (POSIX 1003.1-2001 (Single Unix v4) définitions de base §4.11 résolution de chemin d'accès, un /
à la fin est équivalent à un /.
final . Définitions de base POSIX 1003.1-2008 (Single Unix v4) §4.13 supprime l'exigence de le rendre équivalent à /.
, afin de gérer les répertoires inexistants (par exemple, mkdir foo/
est nécessaire pour fonctionner, alors que mkdir foo/.
ne le ferait pas - voir la justification du changement).
Pour les programmes qui agissent sur une entrée de répertoire, if foo
est un lien symbolique vers un répertoire, puis en passant foo/
est un moyen de faire agir le programme sur le répertoire au lieu du lien symbolique.
¹ Notez que cela s'applique uniquement à la résolution des noms de chemin, c'est-à-dire lors de l'accès aux fichiers. Les manipulations de noms de fichiers peuvent fonctionner différemment. Par exemple basename
et dirname
ignorer les barres obliques finales.