Você quer evitar que seja um parâmetro, por isso, tentamos adicionar algo a ele. O diretório atual pode ser acessado com . , assim a subpasta - pode ser acessada alternativamente com ./- .
cd ./-
O motivo pelo qual cd -- - não funciona é porque isso é implementado de forma diferente se você comparar rm (consulte man rm ) para cd (consulte man bash ou man cd ), cd tem uma interpretação diferente que vê - como parâmetro (veja man bash ou man cd ).
Deve-se notar também que cd é uma função embutida no shell, como pode ser lido em esta resposta :
cdis not an external command - it is a shell builtin function. It runs in the context of the current shell, and not, as external commands do, in a fork/exec'd context as a separate process.
Existe um comando cd externo, mas faz algo totalmente diferente .
Isso explica por que a implementação é diferente, como Bash e Corutils são duas coisas diferentes.
Vamos apenas supor que você não acreditaria nisso, como podemos confirmar isso? Use which e 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
Veja man which para mais informações, e man bash ou man type para type