GNU/Linux >> Tutoriels Linux >  >> Linux

Comment Linux gère-t-il plusieurs séparateurs de chemins consécutifs (/home////nom d'utilisateur///fichier) ?

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.


Linux
  1. Linux :Différence entre /dev/console , /dev/tty et /dev/tty0 ?

  2. Comment savoir à partir de quel dossier un processus est en cours d'exécution ?

  3. Pourquoi mettre des choses autres que /home sur une partition séparée ?

  4. Pourquoi < ou > sont-ils nécessaires pour utiliser /dev/tcp

  5. Comment changer /tmp par défaut en /home/user/tmp

Bash =~ Regex et Https://regex101.com/?

Quelle est la portabilité de /dev/stdin, /dev/stdout et /dev/stderr ?

Linux – Fusionner /usr/bin et /usr/sbin dans /bin (gnu/linux) ?

Kubuntu affiche une erreur lors de la connexion (file:///usr/share/sddm//themes/breeze/main.qml:no Such File Or Directory) ?

Ubuntu 14.04 "n'a pas obtenu d'Uri de lecture sur le fichier d'entrée:///*" ?

Comprendre les fichiers /proc/mounts, /etc/mtab et /proc/partitions