Vous voulez éviter qu'il ne soit un paramètre, nous essayons donc de lui ajouter quelque chose. Le répertoire courant est accessible avec .
, ainsi le sous-dossier -
peut être consulté alternativement avec ./-
.
cd ./-
La raison pour laquelle cela cd -- -
ne fonctionne pas est que cela est implémenté différemment si vous comparez rm
(voir man rm
) à cd
(voir man bash
ou man cd
), cd
a une interprétation différente qui voit -
comme paramètre (voir man bash
ou man cd
).
Il convient également de noter qu'il cd
s'agit d'une fonction intégrée au shell, comme on peut le lire dans cette réponse :
cd
n'est pas une commande externe - c'est une fonction intégrée au shell. Il s'exécute dans le contexte du shell actuel, et non, comme le font les commandes externes, dans un contexte fork / exec'd en tant que processus séparé.
Il existe une cd
commande externe , mais elle fait quelque chose de complètement différent .
Cela explique pourquoi l'implémentation est différente, car Bash et Coreutils sont deux choses différentes.
Supposons simplement que vous ne croyiez pas cela, comment pouvons-nous le confirmer? Utilisez which
et type
.
$ which cd && type cd
which: no cd in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.7.2:/usr/games/bin
cd is a shell builtin
$ which rm && type rm
/bin/rm
/bin/rm is /bin/rm
Voir man which
pour plus d'informations et man bash
ou man type
pourtype
cd
soit une fonction intégrée. La raison pour laquellecd -- -
cela ne fonctionne pas est que-
c'est un opérande, pas une option.cd -- -
vous changera en un répertoire nommé-
dans le répertoire courant. FWIW.Un moins (alias tiret) n'est pas à lui seul une option, mais un opérande (c'est-à-dire un argument qui n'est pas une option). Pour cette raison, la mise en
--
avant n'a aucun effet. Le tiret est un opérande danscd -
et toujours un opérande danscd -- -
. Comme les autres utilitaires standard,cd
traite un opérande comme un opérande, qu'il soit ou non--
devant lui.La
cd
commande attribue une signification spéciale à l'opérande-
. Tout le reste est un répertoire vers lequel basculer.cd -- -a
bascule vers le répertoire appelé-a
, car-a
n'est pas spécial comme opérande et--
empêchecd
de le traiter comme une option. Cela ne fonctionne pas-
seul, ce qui n'est pas une option.Mettre des guillemets
-
ne va pas aider, car cela finirait par passer l'opérande de-
toute façon.Votre seul recours est donc de trouver une autre manière d'exprimer la même idée, c'est-à-dire un autre nom pour le même répertoire. Heureusement, il y en a un simple: si vous ajoutez
./
avant un nom de fichier relatif, cela signifie toujours le même fichier. Le./
fait une différence qui n'est pas pertinente dans notre cas:CDPATH
n'est pas consulté lorsque le nom du répertoire commence par/
,./
ou../
. Ainsi:Une autre façon, puisqu'il
-
s'agit d'un répertoire, est d'ajouter un/
après. L'ajout d'un/
à la fin d'un nom de fichier garantit que le fichier est traité comme un répertoire (en particulier, la commande fonctionnera sur le répertoire lui-même et non sur le lien symbolique si le fichier est un lien symbolique vers un répertoire), mais fait autrement aucune différence. Ainsi:Soit
-/
dit en passant, l' écriture est suggérée par le code d'achèvement, mais dans bash il ne fonctionne qu'en fait--
avant, bash n'a pas de cas particulier pourcd -/
(zsh le fait).la source
cd -- -/
, mais en raison d'avoir exécuté l'équivalent decd -
juste avant cela, le répertoire n'existait pas et je l'ai interprété comme une autre tentative infructueuse.Se qualifier avec le chemin est une option.
la source
Ceux-ci fonctionneraient également:
ou
la source