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://$
. ls
indique 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.
Réponses:
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 lereadlink /proc/self/cwd
dirait l' exécution ; de même,/usr//local///bin
est 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 entrecd
dans 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.la source
zsh
permetcd //
, mais est suffisamment intelligent pour simplement s'afficher/
dans la chaîne d'invite.De la définition du nom de chemin POSIX:
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:
la source
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 /la source
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;)
la source
//
invite est un effet secondaire de votre variable d'environnement d'invite ($PS1
) - comment est-ellePS1
définie?$PS1
variable est définie comme[\u@\h \W]\$
. Un problème avec le réglage?/
lorsque pwd =/
. Je me demandais si vous faisiez un travail supplémentaire pour obtenir le répertoire. Est$PROMPT_COMMAND
réglé?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.PS1
etPROMPT_COMMAND
- utilisezman bash
sur votre ligne de commande ou lisez en ligneC'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.
le contenu complet de la variable de projet est
la source