Тут грають дві речі. По-перше, -
поодинці розширено до попереднього каталогу. Це пояснюється в cd
розділі man bash
(моє наголос):
Аргумент -
перетворюється в $ OLDPWD перед спробою зміни каталогу. Якщо використовується не порожнє ім'я каталогу від CDPATH або якщо -
це перший аргумент, і зміна каталогу успішно, абсолютна назва нового робочого каталогу записується на стандартний вихід. Повернене значення відповідає дійсності, якщо каталог було успішно змінено; помилково інакше.
Таким чином, звичайний cd -
переведе вас до попереднього каталогу та надрукує ім'я каталогу. Інша команда задокументована в розділі "Розширення Тільди":
Якщо префікс tilde є a ~+
, значення змінної оболонки PWD замінює префікс tilde. Якщо префікс тильди є 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 -
це, ви просто надрукуєте -
. Це ~-
частина функціоналу розширення tilde і поводиться аналогічно змінній. Ось чому можна echo ~-
і отримати щось значуще. Ви також можете використовувати його, cd ~-
але ви можете так само добре використовувати його в будь-якій іншій команді. Наприклад, cp ~-/* .
що було б рівнозначноcp "$OLDPWD"/* .
cd ~-
.