Тут грають дві речі. По-перше, -поодинці розширено до попереднього каталогу. Це пояснюється в 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 ~-.