Há duas coisas em jogo aqui. Primeiro, o -sozinho é expandido para o diretório anterior. Isso é explicado na cdseção man bash(ênfase minha):
Um argumento de -é convertido em $ OLDPWD antes da tentativa de alteração do diretório. Se um nome de diretório não vazio do CDPATH for usado, ou se -for o primeiro argumento, e a alteração do diretório for bem-sucedida, o nome do caminho absoluto do novo diretório de trabalho será gravado na saída padrão. O valor de retorno é verdadeiro se o diretório foi alterado com sucesso; false caso contrário.
Portanto, um simples cd -retornará ao diretório anterior e imprimirá o nome do diretório. O outro comando está documentado na seção "Expansão de til":
Se o prefixo til for a ~+, o valor da variável de shell PWD substituirá o prefixo til. Se o prefixo til for a ~-, o valor da variável de shell OLDPWD, se estiver definido, será substituído. Se os caracteres que seguem o til no prefixo do til consistirem em um número N, opcionalmente prefixado por a +ou a -, o prefixo do til será substituído pelo elemento correspondente da pilha de diretórios, como seria exibido pelos diretórios internos chamados com o prefixo til como argumento. Se os caracteres que seguem o til no prefixo de til consistem em um número sem avanço +ou -, +é assumido.
Isso pode ser mais fácil de entender com um exemplo:
$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~ ## prints $HOME
/home/terdon
$ echo ~+ ## prints $PWD
/etc
$ echo ~- ## prints $OLDPWD
/home/terdon/foo
Então, em geral, os -meios "o diretório anterior". É cd -por isso que, por si só, o levará de volta para onde você estava.
A principal diferença é que cd -é específico para o cdbuiltin. Se você tentar echo -, apenas imprimirá a -. Isso ~-faz parte da funcionalidade de expansão til e se comporta de maneira semelhante a uma variável. É por isso que você pode echo ~-e obtém algo significativo. Você também pode usá-lo, cd ~-mas também pode usá-lo em qualquer outro comando. Por exemplo, o cp ~-/* .que seria equivalente acp "$OLDPWD"/* .
cd ~-.