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 dans cd -et toujours un opérande dans cd -- -. Comme les autres utilitaires standard, cdtraite un opérande comme un opérande, qu'il soit ou non --devant lui.
La cdcommande attribue une signification spéciale à l'opérande -. Tout le reste est un répertoire vers lequel basculer. cd -- -abascule vers le répertoire appelé -a, car -an'est pas spécial comme opérande et --empêche cdde 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: CDPATHn'est pas consulté lorsque le nom du répertoire commence par /, ./ou ../. Ainsi:
cd ./-
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:
cd -- -/
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 pour cd -/(zsh le fait).