
Команда Bash
cd -
распечатывает ранее использовавшийся каталог и переходит в него.
С другой стороны, команда Bash
cd ~-
напрямую переходит в ранее использовавшийся каталог, ничего не отображая.
Это единственное отличие? Каков вариант использования каждой из команд?
решение1
Здесь задействованы две вещи. Во-первых, -
одиночка расширяется до вашего предыдущего каталога. Это объясняется в cd
разделе man bash
(выделено мной):
Аргумент
-
преобразуется в $OLDPWD перед попыткой смены каталога. Если используется непустое имя каталога из CDPATH или если-
это первый аргумент и смена каталога прошла успешно, то абсолютный путь к новому рабочему каталогу записывается в стандартный вывод. Возвращаемое значение равно true, если каталог был успешно изменен; в противном случае — false.
Итак, простая команда cd -
переместит вас обратно в предыдущий каталог и выведет его имя. Другая команда описана в разделе «Расширение тильды»:
Если префикс тильды равен
~+
, значение переменной оболочки PWD заменяет префикс тильды. Если префикс тильды равен~-
, значение переменной оболочки 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"/* .
решение2
~-
подлежит раскрытию с помощью тильды (см. man bash), поэтому то, что cd
видит, — это непосредственное имя предыдущего каталога. -
не раскрывается оболочкой, cd
видит его напрямую и ведет себя так, как описано в документации:
Аргумент - эквивалентен $OLDPWD. Если используется непустое имя каталога из CDPATH или если - является первым аргументом, и смена каталога прошла успешно, абсолютный путь к новому рабочему каталогу записывается в стандартный вывод.
решение3
TL;DR: cd -
встроен в cd
, ~-
является более поздним расширением ~[name]
, не относится только к cd
.
POSIX.1-2008 Оболочка и утилитыопределяет cd -
как особый случай, которыйспецифическийдляcd
команда:
Если
-
в качестве операнда используется a, это будет эквивалентно команде:
cd "$OLDPWD" && pwd
который переходит в предыдущий рабочий каталог и затем записывает его имя.
Расширение ~-
будет расширено до $OLDPWD
выполнения любой команды и может быть передано в качестве аргумента для любой команды, а не только cd
. Это более позднее расширение вкшиБаш.
Вышеупомянутый стандарт POSIX.1-2008 Shell & Utilities также имеетподробное объяснение расширения Тильды. Формулировка очень конкретна, чтобы разрешить ~-
неопределенное поведение в рамках стандарта, где ~[name]
ссылается на $HOME
, если [name]
это пустая строка, или на домашний каталог пользователя, name
если name
это допустимое имя пользователя.