Здесь есть две вещи. Во-первых, -один расширяется до вашего предыдущего каталога. Это объясняется в cdразделе man bash(выделение мое):
Аргумент аргумента -преобразуется в $ OLDPWD до попытки изменения каталога. Если используется непустое имя каталога из CDPATH, или если -это первый аргумент, и смена каталога прошла успешно, абсолютный путь нового рабочего каталога записывается в стандартный вывод. Возвращаемое значение равно true, если каталог был успешно изменен; ложь в противном случае.
Таким образом, простой cd -переместит вас обратно в ваш предыдущий каталог и выведет его имя. Другая команда описана в разделе «Расширение тильды»:
Если префикс тильды равен a ~+, значение переменной оболочки PWD заменяет префикс тильды. Если префикс тильды равен a ~-, подставляется значение переменной оболочки OLDPWD, если оно установлено. Если символы, следующие за тильдой в префиксе тильды, состоят из числа N, необязательно с префиксом a +или a -, префикс тильды заменяется соответствующим элементом из стека каталогов, как это будет показано встроенной командой dirs, вызываемой с помощью префикс тильды в качестве аргумента. Если символы, следующие за тильдой в префиксе тильды, состоят из числа без начального +или -, +предполагается.
Это может быть легче понять на примере:
$ 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
Так что, в общем, -означает «предыдущий каталог». Вот почему cd -само по себе вернет вас туда, где вы были.
Основное отличие заключается в том, что cd -характерно для cdвстроенного. Если вы попытаетесь echo -это просто напечатать -. ~-Является частью функциональности расширения тильды и ведет себя аналогично переменный. Вот почему вы можете echo ~-и получить что-то значимое. Вы также можете использовать его, cd ~-но вы также можете использовать его в любой другой команде. Например, cp ~-/* .который будет эквивалентенcp "$OLDPWD"/* .
cd ~-.