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