web-dev-qa-db-fra.com

Comment Linux gère-t-il plusieurs séparateurs de trajectoire consécutifs (/ home //// username //// fichier)?

Je travaille sur un python script qui transmet des emplacements de fichiers à une sous-processus SCP. C'est tout bien amende, mais je suis dans une situation où je peux finir par concaténer un chemin avec un nom de fichier tel que 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 comment exactement corrigé. Est-ce bash qui lande Extra /s ou cela n'a-t-il pas d'importance encore?

Je demande parce que cela me sauvera plusieurs lignes de code pour vérifier plus /s tout en concaténant. Je sais que ce n'est pas une grosse affaire, mais je suis aussi curieux. J'ai un script Bash qui a la ligne cd //usr (à la place de cd /usr), qui semble impliquer qu'il pourrait y avoir une signification d'utiliser plusieurs /s dans un chemin

117
Falmarri

Plusieurs barres obliques sont autorisées et sont équivalentes à une seule barre oblique. Du Spécification unique UNIX (version 4) , Définitions de base §3.271 pathname : "Plusieurs barres obliques successives sont considérées comme étant identiques à une barre oblique".

Il y a une exception près: si un nom de chemin commence par deux caractères successifs, le premier composant qui suit les principaux caractères peut être interprété de manière définie par la mise en œuvre. (Ref: Définitions de base §4.13 Résolution du chemin de chemin ). Linux elle-même ne fait pas cela, bien que certaines applications puissent, et un autre système UNIX-ISH (par exemple Cygwin).

Une trailing / À la fin d'un chemin de chemin force le chemin de chemin pour se référer à un répertoire. Dans ( POSIX 1003.1-2001 (UNIX UNIX V4) Définitions de base §4.11 Résolution de la pathername , une trailing / Est équivalente à un suivi /.. POSIX 1003.1-2008 (Unix unique V4) Définitions de base §4.1 Supprime l'obligation de le rendre équivalent à /., Afin de faire face à des répertoires non existants (par exemple, mkdir foo/ Est nécessaire pour Travail, alors que mkdir foo/. ne serait pas - voir la Justification pour le changement).

Pour les programmes qui agissent sur une entrée de répertoire, si foo est un lien symbolique à 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 de pathname, c'est-à-dire lorsque vous accédez à des fichiers. Les manipulations de nom de fichier peuvent fonctionner différemment. Par exemple basename et dirname Ignorer les barres obliques de fin.

Le système d'exploitation ne semble pas se soucier de cela non plus, après avoir essayé un programme C avec une syscall direct pour ouvrir avec A // sur le chemin.

Vous pouvez utiliser =python Bibliothèque fonction OS.Path.normPath pour la normaliser cependant, ce qui vous permet d'économiser de numériser dans la chaîne à la recherche de suppléments. D'autres langues ont des fonctions similaires.

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

17
Ivatar

Sur tous les systèmes UNIX que j'ai vu, il est identique à un seul /, mais la Standard UNIX Spécifie que

Un nom de chemin qui commence par deux barres obliques successives peut être interprétée de manière définie par la mise en œuvre, bien que plus de deux barres obliques de premier plan soient traitées comme une seule barre oblique.

il peut donc être géré spécialement, en fonction de votre système. (Certaines versions UNIX plus anciennes ont utilisé un double dirigeant / pour l'accès des systèmes de fichiers distants, et il y en a peut-être quelque chose.)

9
Fred Foo

Utilisation os.path.join In Python et vous n'obtiendrez pas plusieurs barres à barres. Construire vous-même des noms de fichiers vous-même par des chaînes concaténantes est considéré comme pauvre Python style.

7
Neil Mayhew

Il n'y a pas de différence.

Plusieurs slashes sont ignorés (sans effet), par exemple:

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

Bien sûr, vous pouvez normaliser un chemin avec des multiples/(barres obliques) possibles en le passant à travers tr -s

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

... puis utilisez $NORMALIZED

Cependant, il devrait être nécessaire. Quant à ce que je connaisse tout noyau correctement Unix devrait ignorer les séparateurs de chemin concurrents --- ou les traiter conceptuellement comme ..././...

0
Jim Dennis