Команда Bash
cd -
печатает ранее использованный каталог и вносит в него изменения.
С другой стороны, команда Bash
cd ~-
напрямую переходит в ранее использовавшийся каталог, ничего не повторяя.
Это единственная разница? Какой вариант использования для каждой из команд?
bash
directory
cd-command
pushd
dr01
источник
источник
cd ~-
.Ответы:
Здесь есть две вещи. Во-первых,
-
один расширяется до вашего предыдущего каталога. Это объясняется вcd
разделеman bash
(выделение мое):Таким образом, простой
cd -
переместит вас обратно в ваш предыдущий каталог и выведет его имя. Другая команда описана в разделе «Расширение тильды»:Это может быть легче понять на примере:
Так что, в общем,
-
означает «предыдущий каталог». Вот почемуcd -
само по себе вернет вас туда, где вы были.Основное отличие заключается в том, что
cd -
характерно дляcd
встроенного. Если вы попытаетесьecho -
это просто напечатать-
.~-
Является частью функциональности расширения тильды и ведет себя аналогично переменный. Вот почему вы можетеecho ~-
и получить что-то значимое. Вы также можете использовать его,cd ~-
но вы также можете использовать его в любой другой команде. Например,cp ~-/* .
который будет эквивалентенcp "$OLDPWD"/* .
источник
set -x
для распечатки расширенной команды перед ее выполнением может быть полезно проиллюстрировать разницу (или может быть просто нечитабельно шумно, когда вы не делаете это самостоятельно по одному шагу за раз).cd ~-/..
работает,cd -/..
нет!~-
подлежит расширению тильды (см. man bash), так чтоcd
непосредственно видно предыдущее имя каталога.-
не раскрывается оболочкой,cd
видит его напрямую и ведет себя так, как задокументировано:источник
TL; DR:
cd -
встроенcd
,~-
является более поздним расширением~[name]
, не относится кcd
.POSIX.1-2008 Shell & Utilities определяет
cd -
как особый случай, специфичный дляcd
команды :~-
Расширение будет расширено$OLDPWD
до того , как команда будет выполнена и может быть передано в качестве аргумента для любой команды, а не толькоcd
. Это более позднее расширение в ksh и bash .Вышеупомянутый стандарт POSIX.1-2008 Shell & Utilities также содержит подробное объяснение расширения Tilde . Формулировка очень специфична и допускает
~-
неопределенное поведение в рамках стандарта, где~[name]
ссылается на$HOME
то,[name]
является ли пустая строка, или на домашний каталог пользователя,name
еслиname
это действительное имя пользователя.источник