Разница между «cd -» и «cd ~-»

Разница между «cd -» и «cd ~-»

Команда 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это допустимое имя пользователя.

Связанный контент