Quel répertoire le chemin `//` représente-t-il sous Linux?

13

Lorsque je veux retourner au répertoire de niveau supérieur sous Linux en tapant cd .., je typo-ed cd //. À ma grande surprise, aucune erreur n'est signalée. De plus, l'invite devient username@hostname://$. lsindique que je suis maintenant dans le répertoire racine.

Est-ce un bug ou une fonctionnalité du shell? S'il s'agit d'une fonctionnalité, est //un alias de /? Mon shell est GNU bash, version 4.1.5 (1) -release (i686-linux-gnu).

Merci et meilleures salutations.

Summer_More_More_Tea
la source
Voir superuser.com/q/314102/91047
Stéphane Gimenez

Réponses:

30

Il peut être envisagé non plus.

Sous Linux, cela //ne veut rien dire - plusieurs barres obliques consécutives sont regroupées en une seule, n'importe où sur le chemin, y compris le début. Changer de répertoire pour //vous y mettre /, comme le readlink /proc/self/cwddirait l' exécution ; de même, /usr//local///binest effondré /usr/local/bin.

Cependant, certains autres systèmes de type Unix, par exemple Cygwin ou l'ancien domaine / système d'exploitation Apollo, utilisent le // préfixe pour les chemins réseau tels que //fileserver/path/to/data. POSIX le permet également.

Pour diverses raisons, le shell bash suit le répertoire actuel seul (en plus du suivi fourni par le système d'exploitation) et contient du code qui empêche l' //effondrement de l'initiale , pour rester compatible avec de tels systèmes. La "fonctionnalité" est que bash fournit un suivi plus intuitif du répertoire courant, par exemple, quand il entre cddans un lien symbolique, bash vous montrera le chemin que vous attendez, même si le noyau pense le contraire. Le "bug" est que bash autorise //même sur les systèmes qui ne l'utilisent pas.

user1686
la source
Fait intéressant, zshpermet cd //, mais est suffisamment intelligent pour simplement s'afficher /dans la chaîne d'invite.
new123456
@BinaryZebra Bitsavers possède une collection d'anciens manuels Unix, y compris Apollo - il devrait y avoir beaucoup d'exemples là-bas. Le site Web du TUHS devrait également contenir quelque chose.
user1686
Merci beaucoup, j'ai trouvé la description de // dans le manuel de Bitsavers.
9

De la définition du nom de chemin POSIX:

Un chemin d'accès peut éventuellement contenir une ou plusieurs barres obliques de fin. Plusieurs barres obliques successives sont considérées comme étant identiques à une barre oblique.

La source

Et plus précisément comme grawity mentionné dans son commentaire ci-dessous, du chapitre 4.11 sur la résolution des chemins:

Un chemin qui commence par deux barres obliques successives peut être interprété d'une manière définie par l'implémentation, bien que plus de deux barres obliques de tête soient traitées comme une seule barre oblique.

Shadok
la source
1
Une section plus appropriée est 4.11 Pathname Résolution (dernier paragraphe), étant donné que le comportement en question apparaît que deux grandes barres obliques.
user1686
3

C'est une sorte de fonctionnalité. Si vous avez un script shell en cours d'utilisation find, par exemple tous les chemins sont préfixés avec ./ habituellement. Ensuite, si vous collez cela sur un chemin réel, il devient `/my/path/./appended/path, qui se résout en / mon / chemin / ajouté / chemin. Donc, si je ne me trompe pas, // get est interprété comme /./ et donc /. C'est la même chose si vous allez dans / home / user //, vous vous retrouverez dans / home / user /

Chuck R
la source
1

J'irais pour l'invite affichant "bug".

Les chemins "/", "//", "////////////////////////", ... ont la même signification: "/". Vous pouvez ajouter autant de "/" où vous voulez dans un chemin Unix, cela ne change pas sa signification.

Le "bug" est plus lié ici au fait que votre invite utilise le dernier chemin tapé valide pour l'affichage, pas le "pwd" réel.

Drôle quand même;)

Ouki
la source
D'accord - l' //invite est un effet secondaire de votre variable d'environnement d'invite ( $PS1) - comment est-elle PS1définie?
Doug Harris
@DougHarris la $PS1variable est définie comme [\u@\h \W]\$. Un problème avec le réglage?
Summer_More_More_Tea
Impair. Si j'essaie cette PS1, je n'en reçois qu'une /lorsque pwd = /. Je me demandais si vous faisiez un travail supplémentaire pour obtenir le répertoire. Est $PROMPT_COMMANDréglé?
Doug Harris
@DougHarris Oui, cette variable est définie, dont la valeur est echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007". Pourriez-vous expliquer en détail un peu? Je ne connais pas très bien ces deux variables. Merci.
Summer_More_More_Tea
Lisez la page de manuel de bash et recherchez PS1et PROMPT_COMMAND- utilisez man bashsur votre ligne de commande ou lisez en ligne
Doug Harris
1

C'est une fonctionnalité et tous les multiples // seront remplacés par un seul /

Son utile si vous avez des variables avec des chemins comme l'exemple à la fin. Ainsi, votre CD ne recevra aucune erreur et vous n'aurez pas à modifier la variable de l'espace de travail.

MY_WORKSPACE = / home / your_username / workspace /
MY_NEW_PROJECT = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PROJECT 

le contenu complet de la variable de projet est

/ home / votre_nom_utilisateur / workspace // my_proj /

phschoen
la source