Здесь есть две вещи. Во-первых, -
один расширяется до вашего предыдущего каталога. Это объясняется в 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 ~-
.